Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
SolutionPackager es una herramienta que puede descomponer de forma reversible un archivo de solución comprimido Microsoft Dataverse en varios archivos XML y otros archivos. Luego puede administrar estos archivos con facilidad con un sistema de control de origen. En las secciones siguientes se muestra cómo ejecutar la herramienta y cómo usarla con soluciones administradas y no administradas.
Importante
La herramienta SolutionPackager ya no es la forma recomendada de desempaquetar y empaquetar soluciones. Las funcionalidades de la herramienta SolutionPackager se incorporan a la CLI de Power Platform. El pac solution comando tiene muchos verbos, como unpack, packclone, y sync que incorporan las mismas funcionalidades subyacentes de la herramienta SolutionPackager.
Dónde encontrar la herramienta SolutionPackager
La herramienta SolutionPackager se distribuye como parte del Microsoft. CrmSdk.CoreTools paquete NuGet. Siga estos pasos para instalar el programa.
- Descargue el paquete NuGet.
- Cambie el nombre de la extensión del nombre de archivo del paquete de .nupkg a .zip.
- Extraiga el contenido del archivo comprimido (zip).
Busque el ejecutable SolutionPackager.exe en la carpeta <nombre-carpeta-extraída>/contents/bin/coretools. Ejecute el programa desde la carpeta coretools o agregue esa carpeta a su RUTA.
Argumentos de la línea de comandos de SolutionPackager
SolutionPackager es una herramienta de línea de comandos. Puede invocarlo mediante los parámetros descritos en la tabla siguiente.
| Argumento | Description |
|---|---|
| /Acción: {Extraer|Empaquetar} | Requerido. La acción a realizar. La acción puede ser ya sea extraer un archivo solución .zip en una carpeta, o comprimir una carpeta en un archivo .zip. |
| /zipfile: <ruta del archivo> | Requerido. El nombre y la ruta de un archivo de solución .zip. Para extraer, el archivo debe existir y ser de lectura. Al comprimir, se reemplaza el archivo. |
| /folder: <ruta de la carpeta> | Requerido. Ruta de acceso a una carpeta. Al extraer, esta carpeta se crea y se rellena con archivos de componentes. Al empaquetar, esta carpeta ya debe existir y contener archivos de componentes extraídos anteriormente. |
| /packagetype: {No administrado|Gestionado|Ambos} | Opcional. El tipo de paquete que se va a procesar. El valor predeterminado es Unmanaged. Omita este argumento en la mayoría de los casos porque la herramienta puede leer el tipo de paquete desde dentro del archivo .zip o de los archivos de componentes. Cuando se extrae y se especifica Both, los archivos .zip de solución administrada y no administrada deben estar presentes y procesarse en una sola carpeta. Cuando se comprime y se especifica Both, los archivos .zip de solución administrada y no administrada se crean desde una carpeta. Para obtener más información, vea la sección sobre cómo trabajar con soluciones administradas y no administradas más adelante en este artículo. |
| /allowWrite:{Sí|No} | Opcional. El valor predeterminado es Sí. Use este argumento solo durante una extracción. Al especificar /allowWrite:No, la herramienta realiza todas las operaciones, pero no escribe ni elimina ningún archivo. Puede probar de forma segura la operación de extracción sin sobrescribir ni eliminar archivos existentes. |
| /allowDelete:{Yes|No|Prompt} | Opcional. El valor predeterminado es Prompt. Use este argumento solo durante una extracción. Al especificar /allowDelete:Yes, la herramienta elimina automáticamente todos los archivos presentes en la carpeta especificada por el parámetro /folder que no se esperen. Al especificar /allowDelete:No, la herramienta no elimina ningún archivo. Al especificar /allowDelete:Prompt, se le pedirá al usuario a través de la consola que permita o deniegue todas las operaciones de eliminación. Si especifica /allowWrite:No, la herramienta no elimina ningún archivo aunque también se especifique /allowDelete:Yes. |
| /clobber | Opcional. Utilice este argumento solo durante una extracción. Al especificar /clobber, la herramienta sobrescribe o elimina los archivos que tienen establecido el atributo de solo lectura. Cuando no se especifica, la herramienta no sobrescribe ni elimina archivos con el atributo de solo lectura. |
| /errorlevel: {Off|Error|Advertencia |Información |Verbose} | Opcional. El valor predeterminado es Info. Este argumento indica el nivel de información del registro para el resultado. |
| /map: <ruta del archivo> | Opcional. La ruta y el nombre de un archivo .xml que contiene directivas de asignación de archivos. Cuando se usa durante una extracción, la herramienta lee los archivos normalmente leídos desde dentro de la carpeta especificada por el parámetro /folder desde ubicaciones alternativas, tal como se especifica en el archivo de asignación. Durante una operación de empaquetado, la herramienta no escribe archivos que coincidan con las directivas. |
| /nologo | Opcional. Suprima el banner en tiempo de ejecución. |
| /log: <ruta del archivo> | Opcional. Una ruta y un nombre a un archivo de registro. Si el archivo ya existe, se anexa nueva información de registro al archivo. |
| <@ ruta del archivo> | Opcional. Ruta y nombre de un archivo que contiene argumentos de línea de comandos para la herramienta. |
| /sourceLoc: <cadena> | Opcional. Este argumento genera un archivo de recursos de plantilla y solo es válido en la extracción. Los valores posibles son auto o un código LCID/ISO para el idioma que desea exportar. Cuando se usa este argumento, la herramienta extrae los recursos de cadena de la configuración regional especificada como un archivo .resx neutro. Si especifica auto o solo la forma larga o corta del modificador, se usa la configuración regional base o la solución. Puede usar la forma corta del comando: / src. |
| /localize | Opcional. Extraiga o combine todos los recursos de cadena en los archivos de .resx. Puede usar la forma abreviada del comando: /loc. La opción de localización admite componentes compartidos para archivos .resx. Para obtener más información, consulte Uso de recursos web RESX. |
| /NombreSolución: <name> | Opcional. Nombre único de la solución que se va a empaquetar o extraer cuando la carpeta de origen contiene varias soluciones en solutions/*/solution.yml. Se requiere cuando se detecta más de una solución. Solo se aplica al formato de control de código fuente de YAML. Puede usar la forma abreviada del comando: /sn. |
| /remapPluginTypeNames | Opcional. Cuando se especifica, la herramienta reasigna los nombres de tipo completos del complemento en función de los ensamblados incluidos en la solución. Habilitado de forma predeterminada en el formato de control de código fuente de YAML. Puede usar la forma abreviada del comando: /fp. |
Formatos de archivo de control de código fuente
SolutionPackager admite dos diseños de carpeta al extraer y empaquetar soluciones.
Formato XML (heredado)
Formato original. La herramienta almacena los metadatos de la solución en Other\Solution.xml y Other\Customizations.xml. La herramienta extrae todos los archivos de componente en una jerarquía de carpetas planas junto a esos archivos. Este formato es el formato predeterminado al extraer un archivo .zip sin más configuración.
Formato de control de código fuente DE YAML
Introducido junto con la integración de Git de Dataverse, este formato almacena los metadatos de la solución como archivos YAML distribuidos en una jerarquía de carpetas estructuradas. Es el formato escrito al confirmar soluciones mediante la integración nativa de Git en Power Apps.
Ventajas sobre el formato XML
- Genera diferencias más limpias y legibles por componente en el control de código fuente.
- Admite varias soluciones en una sola carpeta de repositorio.
- Los archivos de aplicación de lienzo
.msappy los flujos modernos solo se admiten en este formato. - La reasignación de nombres de tipo de complemento está habilitada de forma predeterminada.
Estructura de carpetas requerida
<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
La presencia de una solutions/ subcarpeta que contiene *solution.yml archivos indica el formato YAML.
Si coloca los archivos de manifiesto de YAML (solution.yml, solutioncomponents.yml, etc.) en la raíz de la carpeta en lugar de en solutions/<SolutionUniqueName>/, la herramienta no detecta el formato YAML. La herramienta vuelve a utilizar la ruta de acceso XML e informa de un error engañoso sobre la falta de Customizations.xml. Consulte Solución de problemas para obtener información sobre cómo corregir este problema.
Más información: Referencia del formato de control de código fuente para YAML de la solución
Reglas de auto-detección de formato
| Condición | Formato usado |
|---|---|
solutions/*/solution.yml encontrado: exactamente una solución |
Formato YAML, donde el nombre de la solución se deduce de la carpeta |
solutions/*/solution.yml encontrado: varias soluciones |
Formato YAML, donde se requiere el /SolutionName argumento |
No hay un solutions/ subdirectorio presente |
Formato XML (heredado) |
Empaquetado de una carpeta de formato YAML
El siguiente comando empaqueta una carpeta de formato YAML.
SolutionPackager.exe /action:Pack /zipfile:MySolution.zip /folder:C:\repos\myrepo
Empaquetado desde una carpeta de múltiples soluciones
El siguiente comando empaqueta una solución especificada en una carpeta de varias soluciones.
SolutionPackager.exe /action:Pack /zipfile:SolutionA.zip /folder:C:\repos\myrepo /SolutionName:SolutionA
Utilice el argumento de comando /map
En la siguiente explicación se detalla el uso del argumento /map en la herramienta SolutionPackager.
Los archivos compilados en un sistema de compilación automatizado, como .xap archivos de Silverlight y ensamblados de complementos, normalmente no se registran en el control de código fuente. Es posible que ya tenga recursos web en el control de código fuente en ubicaciones que no sean directamente compatibles con la herramienta SolutionPackager. Al incluir el parámetro /map, puede dirigir la herramienta SolutionPackager para leer y empaquetar dichos archivos desde ubicaciones alternativas en lugar de dentro de la carpeta Extraer. El parámetro /map debe especificar el nombre y la ruta a un archivo XML que contiene directivas de mapeo. Esas directivas indican al SolutionPackager que haga coincidir los archivos por su nombre y ruta, e indican la ubicación alternativa para encontrar el archivo coincidente. La siguiente información se aplica a todas las directivas por igual.
Puede enumerar varias directivas, incluidas las directivas que coinciden con los mismos archivos. Las directivas que se enumeran al principio del archivo tienen prioridad sobre las que se enumeran después.
Si un archivo coincide con alguna directiva, debe encontrarse en al menos una ubicación alternativa. Si no se encuentran alternativas que coincidan, el SolutionPackager emite un error.
Las rutas de acceso de carpeta y archivo pueden ser absolutas o relativas. Las rutas de acceso relativas siempre se evalúan desde la carpeta especificada por el parámetro /folder.
Especifique variables de entorno mediante la sintaxis
%variable%.Use un carácter comodín
**de carpeta para indicar "en cualquier subcarpeta". Solo puede usarlo como parte final de una ruta de acceso, por ejemplo:c:\folderA\**.Use caracteres comodín de nombre de archivo solo en los formularios
*.exto*.*. No se admite ningún otro patrón.En la sección siguiente se describen los tres tipos de asignaciones de directivas, junto con un ejemplo que muestra cómo usarlos.
Mapeo de carpetas
En la sección siguiente se proporciona información detallada sobre la asignación de carpetas.
Formato XML
<Folder map="folderA" to="folderB" />
Descripción
Las rutas de acceso de archivo que coinciden con "folderA" cambian a "folderB".
La jerarquía de subcarpetas de cada carpeta debe coincidir exactamente.
No se admiten los comodines de carpeta.
No se pueden especificar nombres de archivo.
Ejemplos
<Folder map="folderA" to="folderB" /> <Folder map="folderA\folderB" to="..\..\folderC\" /> <Folder map="WebResources\subFolder" to="%base%\WebResources" />
Asignación entre archivos
A continuación se muestra más información detallada sobre asignación de archivo a archivo.
Formato XML
<FileToFile map="path\filename.ext" to="path\filename.ext" />
Descripción
Cualquier archivo que coincida con el parámetro map se lee a partir del nombre y la ruta de acceso especificados en el parámetro to.
Para el map parámetro :
Especifique un nombre de archivo. La ruta es opcional. Si no especifica una ruta de acceso, la asignación puede coincidir con archivos de cualquier carpeta.
No se admiten los comodines de nombre de archivo.
Admite el comodín de carpeta.
Para el
toparámetro :Especifique un nombre de archivo y una ruta de acceso.
El nombre de archivo puede diferir del nombre del
mapparámetro .No se admiten los comodines de nombre de archivo.
Admite el comodín de carpeta.
Ejemplos
<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" />
En el ejemplo de paquete NuGet anterior, cr886_PluginPackageTest.nupkg no se sobrescribe si el archivo ya existe en la ubicación especificada.
Asignación de archivo a ruta
En la sección siguiente se proporciona información detallada sobre la asociación entre archivos y rutas de acceso.
Formato XML
<FileToPath map="path\filename.ext" to="path" />
Descripción
El parámetro map especifica el archivo con el que debe coincidir, y el parámetro to especifica la ruta de acceso desde la que se va a leer.
Para el map parámetro :
Especifique un nombre de archivo. La ruta es opcional. Si no especifica una ruta de acceso, la asignación puede aplicarse a archivos de cualquier carpeta.
Admite caracteres comodín de nombre de archivo.
Admite el comodín de directorio.
Para el to parámetro :
Especifique una ruta de acceso.
Admite el comodín de carpeta.
No especifique un nombre de archivo.
Ejemplos
<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" />
Ejemplo de mapeo
En el siguiente ejemplo de código XML se muestra un archivo de asignación completo que permite a la herramienta SolutionPackager leer cualquier recurso web y los dos ensamblados generados de forma predeterminada de un proyecto de Developer Toolkit denominado 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>
Soluciones administradas y no administradas
Puede exportar un archivo .zip de una solución de Dataverse comprimida como una solución administrada o no administrada.
Solución administrada
Una solución completa lista para importar en una organización. Una vez importado, no puede añadir ni quitar componentes, aunque puede permitir una mayor personalización de forma opcional. Utilice este tipo cuando se haya completado el desarrollo de la solución.
Solución no administrada
Una solución abierta sin restricciones sobre lo que puedas agregar, eliminar o modificar. Use este tipo durante el desarrollo de una solución.
El formato de un archivo de solución comprimido difiere en función de su tipo, administrada o no administrada. SolutionPackager puede procesar archivos de solución comprimidos de cualquier tipo. Sin embargo, la herramienta no puede convertir un tipo a otro. La única manera de convertir archivos de solución en un tipo diferente, como desde no administrado a administrado, es importando el archivo .zip de la solución no administrada en un servidor de Dataverse y, a continuación, exportando la solución como una solución administrada.
SolutionPackager puede procesar archivos de solución no administrados y administrados .zip como un conjunto combinado mediante el /PackageType:Both parámetro . Para realizar esta operación, debe exportar la solución dos veces, una vez de cada tipo. Nombre los archivos .zip de la siguiente manera:
Archivo de .zip no administrado: AnyName.zip
Archivo de .zip administrado: AnyName_managed.zip
La herramienta supone que el archivo ZIP administrado está en la misma carpeta que el archivo no administrado. Extrae ambos archivos en una sola carpeta y conserva las diferencias cuando existen componentes administrados y no administrados.
Después de extraer una solución como no administrada y administrada, puede empaquetar ambos tipos o cada tipo individualmente desde esa única carpeta. Utilice el parámetro /PackageType para especificar qué tipo se va a crear. Al especificar ambos archivos, la herramienta genera dos archivos .zip mediante la convención de nomenclatura anterior. Si no incluye el parámetro /PackageType al empaquetar desde una carpeta dual administrada y no administrada, el valor predeterminado es generar un único archivo .zip no administrado.
Troubleshooting
Mensaje que se muestra al usar Visual Studio para editar archivos de recursos
Si usa Visual Studio para editar los archivos de recursos creados por el empaquetador de soluciones, es posible que vea un mensaje al volver a empaquetar de forma similar a esta: "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." este mensaje aparece porque Visual Studio reemplaza las etiquetas de metadatos del archivo de recursos por etiquetas de datos.
Solución
Abra el archivo de recursos en el editor de texto favorito y, a continuación, busque y actualice las etiquetas siguientes:
<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">Cambie el nombre del nodo de
<data>a<metadata>.Por ejemplo, esta cadena:
<data name="Source LCID" xml:space="preserve"> <value>1033</value> </data>Cambia a:
<metadata name="Source LCID" xml:space="preserve"> <value>1033</value> </metadata>Este cambio permite que el empaquetador de soluciones lea e importe el archivo de recursos. Este problema solo se produce cuando se usa el editor de recursos de Visual Studio.
Error: "No se encuentra el archivo necesario ...\Other\Customizations.xml" con una carpeta YAML
Este error aparece cuando se ejecuta SolutionPackager (o pac solution pack) en una carpeta que contiene archivos YAML como solution.yml, pero esos archivos se colocan en la raíz de la carpeta en lugar de dentro de la subcarpeta solutions/<SolutionUniqueName>/ requerida.
Causa: La herramienta detecta el formato de control de código fuente de YAML buscando una solutions/ subcarpeta que contiene *solution.yml archivos. Cuando ese directorio está ausente, la herramienta vuelve de forma silenciosa al formato XML (heredado) y espera Other\Customizations.xml. El mensaje de error hace referencia a un archivo XML y no menciona YAML, lo que puede resultar confuso.
Corrección: Reorganice la carpeta para que los archivos de manifiesto de YAML estén en las rutas de acceso correctas:
<rootFolder>/
solutions/<YourSolutionUniqueName>/ ← move solution.yml here
solution.yml
solutioncomponents.yml
rootcomponents.yml
missingdependencies.yml
publishers/<YourPublisherUniqueName>/
publisher.yml
Si obtuvo la carpeta de una confirmación de integración de Git o pac solution clone, la estructura de carpetas ya es correcta. Una carpeta que solo contiene los archivos YAML de nivel superior sin el solutions/ subdirectorio representa una extracción incompleta y no se puede empaquetar directamente.
Advertencia: el componente declarado en rootcomponents.yml no tiene archivos de origen
Esta advertencia aparece cuando un componente, como una aplicación de lienzo, aparece en rootcomponents.yml pero no existen archivos de origen correspondientes en la carpeta de componentes esperada (por ejemplo, canvasapps/<schema-name>/).
Efecto: La herramienta sigue funcionando correctamente (código de salida 0) y genera un archivo válido .zip , pero el componente declarado se omite de la solución empaquetada.
Causa: La carpeta se generó mediante una extracción parcial o los archivos de origen del componente no se incluyeron en el repositorio. Por ejemplo, solo se pusieron en el control de versiones los archivos de manifiesto de la solución y no la propia aplicación Canvas.
Corrección: Asegúrese de que todos los componentes declarados en rootcomponents.yml tienen los archivos de origen correspondientes presentes en la carpeta . En el caso de las aplicaciones de lienzo, el archivo .msapp debe existir en canvasapps/<schema-name>/. Si faltan archivos, vuelva a exportar la solución completa de Dataverse y desempaquetarla de nuevo o use pac solution clone para obtener una extracción completa.