Creación de paquetes con el diseño del empaquetado
Con la introducción de paquetes de recursos, los desarrolladores ahora tienen las herramientas para compilar más paquetes, además de más tipos de paquetes. A medida que una aplicación es más grande y compleja, a menudo se compone de más paquetes, y la dificultad de administrar estos paquetes aumentará (especialmente si está compilando fuera de Visual Studio y usando archivos de asignación). Para simplificar la administración de la estructura de empaquetado de una aplicación, puedes usar el diseño de empaquetado admitido por MakeAppx.exe.
El diseño del empaquetado es un único documento XML que describe la estructura de empaquetado de la aplicación. Especifica los paquetes de una aplicación (principal y opcional), los paquetes de los paquetes y los archivos de los paquetes. Los archivos se pueden seleccionar desde diferentes carpetas, unidades y ubicaciones de red. Los caracteres comodín se pueden usar para seleccionar o excluir archivos.
Una vez configurado el diseño de empaquetado de una aplicación, se usa con MakeAppx.exe para crear todos los paquetes de una aplicación en una sola llamada de línea de comandos. El diseño del empaquetado se puede editar para modificar la estructura del paquete para satisfacer sus necesidades de implementación.
Ejemplo de diseño de empaquetado simple
Este es un ejemplo del aspecto de un diseño de empaquetado simple:
<PackagingLayout xmlns="http://schemas.microsoft.com/appx/makeappx/2017">
<PackageFamily ID="MyGame" FlatBundle="true" ManifestPath="C:\mygame\appxmanifest.xml" ResourceManager="false">
<!-- x64 code package-->
<Package ID="x64" ProcessorArchitecture="x64">
<Files>
<File DestinationPath="*" SourcePath="C:\mygame\*"/>
<File ExcludePath="*C:\mygame\*.txt"/>
</Files>
</Package>
<!-- Media asset package -->
<AssetPackage ID="Media" AllowExecution="false">
<Files>
<File DestinationPath="Media\**" SourcePath="C:\mygame\media\**"/>
</Files>
</AssetPackage>
</PackageFamily>
</PackagingLayout>
Vamos a desglosar este ejemplo para comprender cómo funciona.
PackageFamily
Este diseño de empaquetado creará un único archivo de agrupación de aplicaciones planas con un paquete de arquitectura x64 y un paquete de recursos "Media".
El elemento PackageFamily se usa para definir un lote de aplicaciones. Debe usar el atributo ManifestPath para proporcionar un AppxManifest para la agrupación, el AppxManifest debe corresponder al AppxManifest para el paquete de arquitectura del lote. También se debe proporcionar el atributo ID . Esto se usa con MakeAppx.exe durante la creación del paquete para que pueda crear solo este paquete si lo desea, y será el nombre de archivo del paquete resultante. El atributo FlatBundle se usa para describir qué tipo de agrupación desea crear, true para una agrupación plana (que puede leer más sobre aquí) y false para un lote clásico. El atributo ResourceManager se usa para especificar si los paquetes de recursos de esta agrupación usarán MRT para acceder a los archivos. Esto es true de forma predeterminada, pero a partir de Windows 10, versión 1803, esto aún no está listo, por lo que este atributo debe establecerse en false.
Paquete y AssetPackage
Dentro de PackageFamily, se definen los paquetes que contiene el lote de aplicaciones o las referencias. Aquí, el paquete de arquitectura (también denominado paquete principal) se define con el elemento Package y el paquete de recursos se define con el elemento AssetPackage . El paquete de arquitectura debe especificar la arquitectura para la que está el paquete, ya sea "x64", "x86", "arm" o "neutral". También puede proporcionar directamente un AppxManifest específicamente para este paquete mediante el atributo ManifestPath de nuevo. Si no se proporciona un AppxManifest , se generará automáticamente uno a partir del AppxManifest proporcionado para PackageFamily.
De forma predeterminada, y AppxManifest se generarán para cada paquete dentro del lote. Para el paquete de recursos, también puede establecer el atributo AllowExecution . Si se establece en false (el valor predeterminado), se reducirá el tiempo de publicación de la aplicación, ya que los paquetes que no necesitan ejecutar no tendrán su examen de virus bloquean el proceso de publicación (puede obtener más información sobre esto en Introducción a los paquetes de recursos).
Archivos
Dentro de cada definición de paquete, puede usar el elemento File para seleccionar los archivos que se incluirán en este paquete. El atributo SourcePath es donde los archivos están localmente. Puede seleccionar archivos de diferentes carpetas (proporcionando rutas de acceso relativas), diferentes unidades (proporcionando rutas de acceso absolutas) o incluso recursos compartidos de red (proporcionando algo parecido a \\myshare\myapp\*
). DestinationPath es donde los archivos terminarán dentro del paquete, en relación con la raíz del paquete. ExcludePath se puede usar (en lugar de los otros dos atributos) para seleccionar los archivos que se excluirán de los seleccionados por otros atributos SourcePath de otros elementos File dentro del mismo paquete.
Cada elemento File se puede usar para seleccionar varios archivos mediante caracteres comodín. En general, se puede usar un solo carácter comodín (*
) en cualquier parte de la ruta de acceso cualquier número de veces. Sin embargo, un solo carácter comodín solo coincidirá con los archivos de una carpeta y no con ninguna subcarpeta. Por ejemplo, C:\MyGame\*\*
se puede usar en SourcePath para seleccionar los archivos C:\MyGame\Audios\UI.mp3
y C:\MyGame\Videos\intro.mp4
, pero no puede seleccionar C:\MyGame\Audios\Level1\warp.mp3
. El carácter comodín doble (**
) también se puede usar en lugar de nombres de carpeta o archivo para que coincidan con cualquier cosa recursivamente (pero no puede estar junto a nombres parciales). Por ejemplo, C:\MyGame\**\Level1\**
puede seleccionar C:\MyGame\Audios\Level1\warp.mp3
y C:\MyGame\Videos\Bonus\Level1\DLC1\intro.mp4
. Los caracteres comodín también se pueden usar para cambiar directamente los nombres de archivo como parte del proceso de empaquetado si los caracteres comodín se usan en diferentes lugares entre el origen y el destino. Por ejemplo, tener C:\MyGame\Audios\*
para SourcePath y Sound\copy_*
para DestinationPath puede seleccionar C:\MyGame\Audios\UI.mp3
y hacer que aparezca en el paquete como Sound\copy_UI.mp3
. En general, el número de caracteres comodín únicos y caracteres comodín dobles debe ser el mismo para SourcePath y DestinationPath de un único elemento File .
Ejemplo de diseño de empaquetado avanzado
Este es un ejemplo de un diseño de empaquetado más complicado:
<PackagingLayout xmlns="http://schemas.microsoft.com/appx/makeappx/2017">
<!-- Main game -->
<PackageFamily ID="MyGame" FlatBundle="true" ManifestPath="C:\mygame\appxmanifest.xml" ResourceManager="false">
<!-- x64 code package-->
<Package ID="x64" ProcessorArchitecture="x64">
<Files>
<File DestinationPath="*" SourcePath="C:\mygame\*"/>
<File ExcludePath="*C:\mygame\*.txt"/>
</Files>
</Package>
<!-- Media asset package -->
<AssetPackage ID="Media" AllowExecution="false">
<Files>
<File DestinationPath="Media\**" SourcePath="C:\mygame\media\**"/>
</Files>
</AssetPackage>
<!-- English resource package -->
<ResourcePackage ID="en">
<Files>
<File DestinationPath="english\**" SourcePath="C:\mygame\english\**"/>
</Files>
<Resources Default="true">
<Resource Language="en"/>
</Resources>
</ResourcePackage>
<!-- French resource package -->
<ResourcePackage ID="fr">
<Files>
<File DestinationPath="french\**" SourcePath="C:\mygame\french\**"/>
</Files>
<Resources>
<Resource Language="fr"/>
</Resources>
</ResourcePackage>
</PackageFamily>
<!-- DLC in the related set -->
<PackageFamily ID="DLC" Optional="true" ManifestPath="C:\DLC\appxmanifest.xml">
<Package ID="DLC.x86" Architecture="x86">
<Files>
<File DestinationPath="**" SourcePath="C:\DLC\**"/>
</Files>
</Package>
</PackageFamily>
<!-- DLC not part of the related set -->
<PackageFamily ID="Themes" Optional="true" RelatedSet="false" ManifestPath="C:\themes\appxmanifest.xml">
<Package ID="Themes.main" Architecture="neutral">
<Files>
<File DestinationPath="**" SourcePath="C:\themes\**"/>
</Files>
</Package>
</PackageFamily>
<!-- Existing packages that need to be included/referenced in the bundle -->
<PrebuiltPackage Path="C:\prebuilt\DLC2.appxbundle" />
</PackagingLayout>
Este ejemplo difiere del ejemplo simple con la adición de elementos ResourcePackage y Optional .
Los paquetes de recursos se pueden especificar con el elemento ResourcePackage . Dentro del ResourcePackage, se debe usar el elemento Resources para especificar los calificadores de recursos del paquete de recursos. Los calificadores de recursos son los recursos admitidos por el paquete de recursos, aquí podemos ver que hay dos paquetes de recursos definidos y cada uno contiene los archivos específicos inglés y francés. Un paquete de recursos puede tener más de un calificador; esto se puede hacer agregando otro elemento Resource dentro de Resources. También se debe especificar un recurso predeterminado para la dimensión de recurso si la dimensión existe (dimensiones que son lenguaje, escala, dxfl). Aquí podemos ver que el inglés es el idioma predeterminado, lo que significa que para los usuarios que no tienen un idioma del sistema de francés establecido, revertirán a la descarga del paquete de recursos en inglés y se mostrarán en inglés.
Cada uno de los paquetes opcionales tiene sus propios nombres de familia de paquetes distintos y debe definirse con elementos PackageFamily , mientras se especifica el atributo Optional para que sea true. El atributo RelatedSet se usa para especificar si el paquete opcional está dentro del conjunto relacionado (de forma predeterminada esto es true): si el paquete opcional debe actualizarse con el paquete principal.
El elemento PrebuiltPackage se usa para agregar paquetes que no están definidos en el diseño de empaquetado que se va a incluir o hacer referencia a ellos en los archivos de agrupación de aplicaciones que se van a compilar. En este caso, se incluye aquí otro paquete opcional DLC para que el archivo de agrupación de aplicaciones principal pueda hacer referencia a él y que forme parte del conjunto relacionado.
Compilación de paquetes de aplicaciones con un diseño de empaquetado y MakeAppx.exe
Una vez que tengas el diseño de empaquetado de la aplicación, puedes empezar a usar MakeAppx.exe para compilar los paquetes de la aplicación. Para compilar todos los paquetes definidos en el diseño de empaquetado, use el comando :
MakeAppx.exe build /f PackagingLayout.xml /op OutputPackages\
Pero, si va a actualizar la aplicación y algunos paquetes no contienen archivos modificados, solo puede compilar los paquetes que han cambiado. Con el ejemplo de diseño de empaquetado simple en esta página y la compilación del paquete de arquitectura x64, este es el aspecto que tendría nuestro comando:
MakeAppx.exe build /f PackagingLayout.xml /id "x64" /ip PreviousVersion\ /op OutputPackages\ /iv
La /id
marca se puede usar para seleccionar los paquetes que se van a compilar a partir del diseño de empaquetado, correspondientes al atributo ID del diseño. /ip
se usa para indicar dónde se encuentra la versión anterior de los paquetes en este caso. Se debe proporcionar la versión anterior porque el archivo de agrupación de aplicaciones todavía necesita hacer referencia a la versión anterior del paquete multimedia . La /iv
marca se usa para incrementar automáticamente la versión de los paquetes que se compilan (en lugar de cambiar la versión en AppxManifest). Como alternativa, los modificadores /pv
y /bv
se pueden usar para proporcionar directamente una versión de paquete (para que todos los paquetes se creen) y una versión de agrupación (para que se creen todos los conjuntos), respectivamente.
Con el ejemplo de diseño de empaquetado avanzado de esta página, si solo quiere compilar el paquete opcional Temas y el paquete de la aplicación Themes.main al que hace referencia, usaría este comando:
MakeAppx.exe build /f PackagingLayout.xml /id "Themes" /op OutputPackages\ /bc /nbp
La /bc
marca se usa para indicar que los elementos secundarios del paquete Temas también deben compilarse (en este caso, se compilará Themes.main ). La /nbp
marca se usa para indicar que no se debe compilar el elemento primario de la agrupación temas . El elemento primario de Temas, que es una agrupación de aplicaciones opcional, es la agrupación de aplicaciones principal: MyGame. Normalmente, para un paquete opcional en un conjunto relacionado, el lote de aplicaciones principal también debe compilarse para que el paquete opcional se pueda instalar, ya que también se hace referencia al paquete opcional en el conjunto de aplicaciones principal cuando se encuentra en un conjunto relacionado (para garantizar el control de versiones entre los paquetes principales y opcionales). La relación secundaria primaria entre paquetes se muestra en el diagrama siguiente: