Condividi tramite


Strumento SolutionPackager

SolutionPackager è uno strumento in grado di scomporre in modo reversibile un file di soluzione compresso Microsoft Dataverse in più file XML e in altri file. È quindi possibile gestire facilmente questi file utilizzando un sistema di controllo del codice sorgente. Nelle sezioni seguenti è illustrato come eseguire lo strumento e come utilizzarlo con le soluzioni gestite e non gestite.

Importante

Lo strumento SolutionPackager non è più il modo consigliato per decomprimere e comprimere le soluzioni. Le funzionalità dello strumento SolutionPackager vengono incorporate nell'interfaccia della riga di comando di Power Platform. Il pac solution comando include molti verbi, tra cui unpack, packclone, e sync che incorporano le stesse funzionalità sottostanti dello strumento SolutionPackager.

Dove trovare lo strumento SolutionPackager

Lo strumento SolutionPackager viene distribuito come parte del Microsoft. CrmSdk.CoreTools pacchetto NuGet. Esegui la procedura seguente per l'installare il programma.

  1. Scarica il pacchetto NuGet.
  2. Rinomina l'estensione del nome file del pacchetto da .nupkg a .zip.
  3. Estrai i contenuti del file compresso (zip).

Trovare l'eseguibile SolutionPackager.exe nella cartella <nome-cartella-estratta>/contents/bin/coretools. Esegui il programma dalla cartella coretools o aggiungi quella cartella al tuo PERCORSO.

Argomenti della riga di comando di SolutionPackager

SolutionPackager è uno strumento da riga di comando che può essere richiamato con i parametri identificati nella tabella seguente.

Argomento Descrizione
/action: {Estrai|Confeziona} Obbligatorio. L'azione da eseguire. L'azione può essere l'estrazione di un file .zip della soluzione in una cartella o la compressione di una cartella in un file .zip.
/zipfile: <percorso del file> Obbligatorio. Il percorso e il nome di un file .zip della soluzione. Per l'estrazione, il file deve già esistere e sarà leggibile. Per la compressione, il file viene sostituito.
/folder: <percorso della cartella> Obbligatorio. Il percorso di una cartella. Per l'estrazione, questa cartella viene creata e popolata con i file del componente. Per la compressione, la cartella deve già esistere e contenere i file del componente estratti in precedenza.
/packagetype: {Non gestito|Gestito|Entrambi} (Facoltativo). Il tipo di pacchetto da elaborare. Il valore predefinito è Non gestito. L'argomento può essere omesso nella maggior parte delle occasioni perché il tipo di pacchetto può essere letto dai file del componente o dal file .zip. Quando si estrae e Both viene specificato, i file .zip della soluzione gestiti e non gestiti devono essere presenti ed elaborati in una singola cartella. Quando si crea un pacchetto e Both viene specificato, i file .zip della soluzione non gestiti vengono prodotti da una cartella. Per ulteriori informazioni, vedere la sezione sull'utilizzo delle soluzioni gestite e non gestite più avanti in questo articolo.
/allowWrite:{Yes|No} (Facoltativo). Il valore predefinito è Sì. Questo argomento viene utilizzato solo durante l'estrazione. Se /allowWrite:No viene specificato, lo strumento esegue tutte le operazioni, ma non può scrivere né eliminare alcun file. L'operazione di estrazione può essere applicata in sicurezza senza sovrascrivere o eliminare i file esistenti.
/allowDelete:{Yes|No|Prompt} (Facoltativo). Il valore predefinito è Prompt. Questo argomento viene utilizzato solo durante l'estrazione. Se /allowDelete:Yes viene specificato, i file presenti nella cartella specificata dal parametro /folder non previsti vengono automaticamente eliminati. Se /allowDelete:No viene specificato, non viene eseguita alcuna eliminazione. Se /allowDelete:Prompt viene specificato, all'utente viene richiesto tramite la console di consentire o negare tutte le operazioni di eliminazione. Se /allowWrite:No viene specificato, non viene eseguita alcuna eliminazione anche se è specificato anche /allowDelete:Yes.
/clobber (Facoltativo). Questo argomento viene utilizzato solo durante l'estrazione. Se /clobber viene specificato, i file con l'attributo di sola lettura impostato vengono sovrascritti o eliminati. Se non specificato, i file con l'attributo di sola lettura non vengono sovrascritti o eliminati.
/errorlevel: {Off|Errore |Avviso |Informazioni |Dettagliato} (Facoltativo). Il valore predefinito è Info. Questo argomento indica il livello delle informazioni del registro di output.
/map: <percorso del file> (Facoltativo). Il percorso e il nome di un file .xml che contiene le direttive di mapping dei file. Se utilizzato durante estrazione, i file in genere letti dalla cartella specificata dal parametro /folder vengono letti da posizioni alternative come specificato nel file di mapping. Durante un'operazione pack, i file che corrispondono alle direttive non vengono scritti.
/nologo (Facoltativo). Eliminare lo striscione al runtime.
/log: <percorso del file> (Facoltativo). Il percorso e il nome di un file di registro. Se il file è già presente, le nuove informazioni del registro vengono aggiunte in coda al file.
<@ percorso del file> (Facoltativo). Il percorso e il nome di un file contenente gli argomenti della riga di comando per lo strumento.
/sourceLoc: <string> (Facoltativo). Questo argomento genera di un file di risorse di modello ed è valido solo per l'estrazione.

I valori possibili sono auto o un codice LCID/ISO per la lingua che si desidera esportare. Quando questo argomento viene utilizzato, le risorse di tipo stringa dalle impostazioni locali specificate vengono estratte come file con estensione resx indipendente dalla lingua. Se viene specificato auto o semplicemente il formato breve o lungo dell'opzione, vengono usate le impostazioni locali di base o la soluzione. È possibile utilizzare il formato breve del comando: /src.
/localize (Facoltativo). Estrarre o unire tutte le risorse di tipo stringa nei file con estensione resx. È possibile utilizzare il formato breve del comando: /loc. L'opzione localize supporta i componenti condivisi per i file .resx. Ulteriori informazioni: Utilizzo delle risorse Web RESX
/SolutionName: <nome> (Facoltativo). Nome univoco della soluzione da comprimere o estrarre quando la cartella di origine contiene più soluzioni in solutions/*/solution.yml. Obbligatorio quando vengono rilevate più soluzioni. Si applica solo al formato di controllo del codice sorgente YAML. È possibile usare la forma breve del comando : /sn.
/remapPluginTypeNames (Facoltativo). Se specificato, i nomi completi dei tipi del plug-in vengono rimappati in base agli assembly inclusi nella soluzione. Abilitato per impostazione predefinita nel formato del controllo del codice sorgente YAML. È possibile usare la forma breve del comando: /fp.

Formati di file di controllo del codice sorgente

SolutionPackager supporta due layout di cartelle durante l'estrazione e la compressione di soluzioni.

Formato XML (obsoleto)

Formato originale. I metadati della soluzione vengono archiviati in Other\Solution.xml e Other\Customizations.xmle tutti i file dei componenti vengono estratti in una gerarchia di cartelle flat insieme a tali file. Questo formato è il formato predefinito durante l'estrazione di un .zip file senza più configurazione.

Formato del controllo del codice sorgente YAML

Introdotto insieme all'integrazione di Dataverse Git, questo formato archivia i metadati della soluzione come file YAML distribuiti in una gerarchia di cartelle strutturata. È il formato scritto quando si esegue il commit di soluzioni usando l'integrazione Git nativa in Power Apps.

Vantaggi rispetto al formato XML

  • Produce differenze più pulite e leggibili per componente nel controllo del codice sorgente
  • Supporta più soluzioni in una singola cartella del repository
  • I file dell'app .msapp Canvas e i flussi moderni sono supportati solo in questo formato
  • Il mapping del nome tipo di plug-in è abilitato per impostazione predefinita

Struttura di cartelle richiesta

<rootFolder>/
├── solutions/
│   └── <SolutionUniqueName>/
│       ├── solution.yml              (solution metadata)
│       ├── solutioncomponents.yml    (paths to all component files)
│       ├── rootcomponents.yml        (root-level components)
│       └── missingdependencies.yml   (dependency info)
├── publishers/
│   └── <PublisherUniqueName>/
│       └── publisher.yml             (publisher definition)
├── entities/                         (entity components, if present)
├── workflows/                        (classic workflows, if present)
├── modernflows/                      (Power Automate cloud flows, if present)
├── canvasapps/                       (canvas app .msapp files, if present)
└── [other component folders]/

Importante

Il formato YAML viene rilevato automaticamente dalla presenza di una solutions/ sottocartella contenente *solution.yml file. Se i file manifesto YAML (solution.yml, solutioncomponents.ymle così via) vengono inseriti nella radice della cartella anziché in solutions/<SolutionUniqueName>/, lo strumento non rileva il formato YAML. Lo strumento esegue il fallback al percorso XML e segnala un errore fuorviante relativo a un elemento mancante Customizations.xml. Per informazioni su come risolvere questo problema, vedere Risoluzione dei problemi .

Altre informazioni: Informazioni di riferimento sul formato del controllo del codice sorgente YAML della soluzione

Formattare le regole di rilevamento automatico

Condition Formato usato
solutions/*/solution.yml trovato — esattamente una soluzione Formato YAML, in cui il nome della soluzione viene dedotto dalla cartella
solutions/*/solution.yml trovato — più soluzioni Formato YAML, dove l'argomento /SolutionName è obbligatorio
Nessuna solutions/ sottodirectory presente Formato XML (obsoleto)

Compressione di una cartella di formato YAML

Il comando seguente include una cartella di formato YAML.

SolutionPackager.exe /action:Pack /zipfile:MySolution.zip /folder:C:\repos\myrepo

Compressione da una cartella multi-soluzione

Il comando seguente include una soluzione specificata in una cartella multi-soluzione.

SolutionPackager.exe /action:Pack /zipfile:SolutionA.zip /folder:C:\repos\myrepo /SolutionName:SolutionA

Utilizzare l'argomento di comando /map

Nella seguente discussione si definisce l'utilizzo dell'argomento /map per lo strumento SolutionPackager.

I file incorporati in un sistema di compilazione automatizzato, ad esempio assembly di plug-in e file .xap di Silverlight, di solito non vengono archiviati nel controllo del codice sorgente. Le risorse Web possono essere già presenti nel controllo del codice sorgente in posizioni non direttamente compatibili con lo strumento SolutionPackager. Includendo il parametro /map, lo strumento SolutionPackager può essere diretto alla lettura e alla compressione dei file da posizioni alternative e non dalla cartella Extract come in genere accade. Il parametro /map deve specificare il nome e il percorso di un file XML contenente le direttive di mappatura. Tali direttive indicano a SolutionPackager di abbinare i file in base al nome e al percorso e indicano la posizione alternativa per trovare il file corrispondente. Le informazioni seguenti si applicano a tutte le direttive.

  • Possono essere elencate più direttive, incluse quelle che abbinano i file identici. Le direttive elencate prima nel file hanno la precedenza su quelle specificate dopo.

  • Se un file è corrispondente a una direttiva, si deve trovare in almeno un percorso alternativo. Se nessuna alternativa corrispondente viene trovata, verranno restituiti errori da SolutionPackager.

  • I percorsi dei file e delle cartelle devono essere assoluti o relativi. I percorsi relativi vengono sempre valutati dalla cartella specificata dal parametro /folder.

  • Le variabili di ambiente possono essere specificate utilizzando la sintassi %variable%.

  • Un wildcard di cartella "**" può essere usato per indicare "in qualsiasi sottocartella". Può essere usato solo come parte finale di un percorso, ad esempio "c:\folderA\**".

  • I caratteri jolly del nome file possono essere utilizzati solo nei formati "*.ext" o "*.*". Nessun altro modello è supportato.

    Di seguito sono descritti i tre tipi di mapping di direttive, insieme a un esempio che illustra come utilizzarli.

Mapping di cartella

Le seguenti informazioni sono dettagliate sul mapping di cartella.

Formato XML

<Folder map="folderA" to="folderB" />

Descrizione

I percorsi di file che corrispondono a "folderA" vengono passati a "folderB".

  • La gerarchia delle sottocartelle di ogni percorso deve corrispondere esattamente.

  • I caratteri jolly di cartella non sono supportati.

  • Non è possibile specificare i nomi file.

    Esempi

    <Folder map="folderA" to="folderB" />  
    <Folder map="folderA\folderB" to="..\..\folderC\" />  
    <Folder map="WebResources\subFolder" to="%base%\WebResources" />  
    

Mapping di file a file

Le seguenti informazioni forniscono più dettagli nel mapping file a file.

Formato XML

<FileToFile map="path\filename.ext" to="path\filename.ext" />

Descrizione

Qualsiasi file corrispondente al parametro map verrà letto dal nome e dal percorso specificato nel parametro to.

Per il parametro map:

  • Deve essere specificato un nome file. Il percorso è facoltativo. Se non viene specificato alcun percorso, è possibile corrispondere i file di qualsiasi cartella.

  • I caratteri jolly di nome file non sono supportati.

  • Il carattere jolly di cartella non è supportato.

    Per il parametro to:

  • Devono essere specificati un nome file e un percorso.

  • Il nome file può essere diverso dal nome nel parametro map.

  • I caratteri jolly di nome file non sono supportati.

  • Il carattere jolly di cartella non è supportato.

Esempi

  <FileToFile map="assembly.dll" to="c:\path\folder\assembly.dll" />  
  <FileToFile map="PluginAssemblies\**\this.dll" to="..\..\Plugins\**\that.dll" />  
  <FileToFile map="Webresrouces\ardvark.jpg" to="%SRCBASE%\CrmPackage\WebResources\JPG format\aardvark.jpg" />  
  <FileToFile
    map="pluginpackages\cr886_PluginPackageTest\package\cr886_PluginPackageTest.nupkg"
    to="myplg\bin\Debug\myplg.1.0.0.nupkg" /> 

Nell'esempio del pacchetto NuGet riportato sopra, cr886_PluginPackageTest.nupkg non viene sovrascritto se il file esiste già nella posizione specificata.

Mapping di file a percorso

Nella tabella seguente sono disponibili le informazione dettagliate sul mapping di file a percorso.

Formato XML

<FileToPath map="path\filename.ext" to="path" />

Descrizione

Qualsiasi file corrispondente al parametro map viene letto dal percorso specificato nel parametro to.

Per il parametro map:

  • Deve essere specificato un nome file. Il percorso è facoltativo. Se non viene specificato alcun percorso, è possibile corrispondere i file di qualsiasi cartella.

  • I caratteri jolly di nome file sono supportati.

  • Il carattere jolly di cartella non è supportato.

Per il parametro to:

  • Deve essere specificato un percorso.

  • Il carattere jolly di cartella non è supportato.

  • Non deve essere specificato un nome file.

    Esempi

  <FileToPath map="assembly.dll" to="c:\path\folder" />  
  <FileToPath map="PluginAssemblies\**\this.dll" to="..\..\Plugins\bin\**" />  
  <FileToPath map="*.jpg" to="%SRCBASE%\CrmPackage\WebResources\JPG format\" />  
  <FileToPath map="*.*" to="..\..\%ARCH%\%TYPE%\drop" />  

Mapping di esempio

Il seguente esempio di codice XML illustra un file di mapping completo che consente allo strumento SolutionPackager di leggere una risorsa Web e i due assembly generati predefiniti da un progetto Toolkit sviluppatori denominato CRMDevTookitSample.

<?xml version="1.0" encoding="utf-8"?>  
<Mapping>  
       <!-- Match specific named files to an alternate folder -->  
       <FileToFile map="CRMDevTookitSamplePlugins.dll" to="..\..\Plugins\bin\**\CRMDevTookitSample.plugins.dll" />  
       <FileToFile map="CRMDevTookitSampleWorkflow.dll" to="..\..\Workflow\bin\**\CRMDevTookitSample.Workflow.dll" />  
       <!-- Match any file in and under WebResources to an alternate set of subfolders -->  
       <FileToPath map="WebResources\*.*" to="..\..\CrmPackage\WebResources\**" />  
       <FileToPath map="WebResources\**\*.*" to="..\..\CrmPackage\WebResources\**" />  
</Mapping>  

Soluzioni gestite e non gestite

Un file Dataverse della soluzione compressa (.zip) può essere esportato in uno dei due tipi, come illustrato di seguito.

Soluzione gestita
Una soluzione completata pronta per essere importata in un'organizzazione. Dopo l'importazione, i componenti non possono essere aggiunti o rimossi, anche se facoltativamente possono consentire un'ulteriore personalizzazione. Questa soluzione è consigliata quando lo sviluppo di soluzioni è stato completato.

Soluzione non gestita
Una soluzione aperta senza limitazioni su ciò che è possibile aggiungere, rimuovere o modificare. Questa soluzione è consigliata quando si sviluppa una soluzione.

Il formato di un file della soluzione compresso sarà diverso a seconda del tipo (gestito o non gestito). SolutionPackager può elaborare file di soluzione compressi di entrambi i tipi. Tuttavia, lo strumento non può convertire un tipo in un altro. L'unico modo per convertire i file di soluzione in un tipo diverso, ad esempio da non gestito in gestito, consiste nell'importare il file .zip della soluzione non gestita in un server Dataverse e quindi nell'esportare la soluzione come soluzione gestita.

SolutionPackager può elaborare file .zip di soluzione gestita e non gestita come set combinato utilizzando il parametro /PackageType:Both. Per eseguire questa operazione, è necessario esportare la soluzione due volte, come ciascun tipo, denominando i file .zip come segue.

File .zip non gestito: AnyName.zip

File .zip gestito: AnyName_managed.zip

Lo strumento presuppone la presenza del file .zip gestito nella stessa cartella che contiene il file non gestito ed estrae entrambi i file in una singola cartella mantenendo le differenze tra componenti gestiti e non gestiti esistenti.

Una volta estratta una soluzione come gestita e non gestita, è possibile dalla singola cartella comprimere entrambi i tipi insieme o ogni tipo singolarmente, utilizzando il parametro /PackageType per specificare il tipo da creare. Se si specificano entrambi i file, vengono prodotti due file .zip utilizzando la convenzione di denominazione indicata in precedenza. Se il parametro /PackageType non è presente quando si comprime da una cartella gestita e non gestita, per impostazione predefinita viene prodotto un singolo file .zip non gestito.

Risoluzione dei problemi

Messaggio visualizzato quando si usa Visual Studio per modificare i file di risorse

Se si usa Visual Studio per modificare i file fsile di risorse creati dal packager della soluzione, è possibile che venga visualizzato un messaggio quando si esegue il repack simile al seguente: "Failed to determine version id of the resource file <filename>.resx the resource file must be exported from the solutionpackager.exe tool in order to be used as part of the pack process." Questo accade perché Visual Studio sostituisce i tag di metadati del file di risorse con i tag di dati.

Soluzione alternativa

  1. Aprire il file di risorse nell'editor di testo desiderato e individuare e aggiornare i tag seguenti:

    <data name="Source LCID" xml:space="preserve">  
    <data name="Source file" xml:space="preserve">  
    <data name="Source package type" xml:space="preserve">  
    <data name="SolutionPackager Version" mimetype="application/x-microsoft.net.object.binary.base64">  
    
    
  2. Modificare il nome del nodo da <data> a <metadata>.

    Ad esempio, la stringa:

    <data name="Source LCID" xml:space="preserve">  
      <value>1033</value>  
    </data>  
    
    

    diventa:

    <metadata name="Source LCID" xml:space="preserve">  
      <value>1033</value>  
    </metadata>  
    
    

    Questo consente al programma di creazione del pacchetto della soluzione di leggere e importare il file di risorse. Questo problema è stato rilevato solo quando si usa l'editor di risorse Visual Studio.

Errore: "Impossibile trovare il file obbligatorio ...\Other\Customizations.xml" con una cartella YAML

Questo errore viene visualizzato quando si esegue SolutionPackager (o pac solution pack) in una cartella contenente file YAML, solution.ymlad esempio , ma tali file vengono inseriti nella radice della cartella anziché all'interno della sottocartella richiesta solutions/<SolutionUniqueName>/ .

Causa: Lo strumento rileva il formato di controllo del codice sorgente YAML cercando una solutions/ sottocartella contenente *solution.yml file. Quando la directory è assente, lo strumento esegue automaticamente il fallback al formato XML (legacy) e prevede Other\Customizations.xml. Il messaggio di errore risultante fa riferimento a un file XML e non menziona YAML, che è fuorviante.

Correzione: Riorganizzare la cartella in modo che i file manifesto YAML si trovino nei percorsi corretti:

<rootFolder>/
  solutions/<YourSolutionUniqueName>/   ← move solution.yml here
    solution.yml
    solutioncomponents.yml
    rootcomponents.yml
    missingdependencies.yml
  publishers/<YourPublisherUniqueName>/
    publisher.yml

Se la cartella è stata ottenuta da un commit di integrazione Git o pac solution clone, la struttura di cartelle dovrebbe essere già corretta. Una cartella che contiene solo i file YAML di primo livello senza la solutions/ sottodirectory rappresenta un estratto incompleto e non può essere compresso direttamente.

Avviso: il componente dichiarato in rootcomponents.yml non contiene file di origine

Questo avviso viene visualizzato quando un componente, ad esempio un'app canvas, è elencato in rootcomponents.yml ma non esistono file di origine corrispondenti nella cartella del componente previsto (ad esempio, canvasapps/<schema-name>/).

Effetto: Lo strumento ha comunque esito positivo (codice di uscita 0) e produce un file valido .zip , ma il componente dichiarato viene omesso dalla soluzione in pacchetto.

Causa: La cartella è stata prodotta da un estratto parziale o i file di origine del componente non sono stati inclusi nel repository. Ad esempio, solo i file manifesto della soluzione sono stati sottoposti a commit e non all'app canvas stessa.

Correzione: Verificare che tutti i componenti dichiarati in rootcomponents.yml abbiano i file di origine corrispondenti presenti nella cartella . Per le app canvas, il .msapp file deve esistere in canvasapps/<schema-name>/. Se mancano file, esportare nuovamente la soluzione completa da Dataverse e decomprimerla oppure usare pac solution clone per ottenere un estratto completo.

Vedi anche