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.
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 más 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, puede 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 las necesidades de implementación.
Ejemplo de diseño de empaquetado simple
Este es un ejemplo del aspecto de un diseño de empaquetado sencillo:
<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 una agrupación de aplicaciones. Debe usar el atributo ManifestPath para proporcionar un AppxManifest para la agrupación, appxManifest debe corresponder al appxManifest para el paquete de arquitectura de la agrupación. 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 este 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 Paquete de Activos
Dentro de PackageFamily, se definen los paquetes que contiene o hace referencia a la agrupación de aplicaciones. 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 (opcionalmente) proporcionar directamente un AppxManifest específicamente para este paquete utilizando nuevamente el atributo ManifestPath. Si no se proporciona appxManifest , se generará automáticamente uno a partir de appxManifest proporcionado para PackageFamily.
De forma predeterminada, se generará un AppxManifest para cada paquete del lote. Para el paquete de recursos, también puede establecer el atributo AllowExecution . Establecer esto en false (el valor predeterminado), ayudará a 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 bloquear 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 se encuentran 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 carácter comodín único (*
) en cualquier parte de la ruta 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 elemento 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_*
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 solo 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 sencillo con la adición de elementos ResourcePackage y Optional .
Los paquetes de recursos se pueden especificar con el elemento ResourcePackage . Dentro del ResourcePackage, el elemento Resources debe usarse 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 de inglés y francés. Un paquete de recursos puede tener más de un calificador; para ello, puede agregar 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 inglés es el idioma predeterminado, lo que significa que para los usuarios que no tienen configurado el idioma del sistema en francés, recurrirán a descargar el paquete de recursos en inglés y se mostrará la interfaz en inglés.
Cada uno de los paquetes opcionales tiene sus propios nombres de familia de paquetes distintos y debe definirse con elementos PackageFamily , al tiempo que 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 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 otro paquete opcional DLC aquí para que el archivo de agrupación de aplicaciones principal pueda hacer referencia a él y que forme parte del conjunto relacionado.
Compilar paquetes de aplicaciones con un diseño de empaquetado y el elemento 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 de 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, correspondiente 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 debe 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 conmutadores /pv
y /bv
se pueden usar para proporcionar directamente una versión del paquete (para que se creen todos los paquetes) y una versión del paquete combinado (para que se creen todos los paquetes combinados), 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 a los que hace referencia, usaría este comando:
MakeAppx.exe build /f PackagingLayout.xml /id "Themes" /op OutputPackages\ /bc /nbp
La /bc
bandera se usa para indicar que los subcomponentes 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 paquete de aplicaciones principal también debe compilarse para que se pueda instalar el paquete opcional, 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 el paquete principal y los paquetes opcionales). La relación padre-hijo entre paquetes se muestra en el diagrama siguiente.