Delen via


Het maken van pakketten met het verpakkingsontwerp

Met de introductie van assetpakketten beschikken ontwikkelaars nu over de hulpprogramma's voor het bouwen van meer pakketten, naast meer pakkettypen. Naarmate een app groter en complexer wordt, zal deze vaak uit meer pakketten bestaan en zal de moeilijkheid om deze pakketten te beheren toenemen (vooral als u buiten Visual Studio bouwt en gebruikmaakt van mappingbestanden). Om het beheer van de verpakkingsstructuur van een app te vereenvoudigen, kunt u de verpakkingsindeling gebruiken die wordt ondersteund door MakeAppx.exe.

De indeling van de verpakking is één XML-document waarin de structuur van de verpakking van de app wordt beschreven. Hiermee worden de bundels van een app opgegeven (primair en optioneel), de pakketten in de bundels en de bestanden in de pakketten. Bestanden kunnen worden geselecteerd uit diverse mappen, schijven en netwerklocaties. Jokertekens kunnen worden gebruikt om bestanden te selecteren of uit te sluiten.

Nadat de verpakkingsindeling voor een app is ingesteld, wordt deze gebruikt met MakeAppx.exe om alle pakketten voor een app te maken in één opdrachtregelaanroep. De indeling van de verpakking kan worden bewerkt om de pakketstructuur aan te passen aan uw implementatiebehoeften.

Voorbeeld van eenvoudige verpakkingsindeling

Hier volgt een voorbeeld van hoe een eenvoudige verpakkingsindeling eruitziet:

<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>

Laten we dit voorbeeld opsplitsen om te begrijpen hoe het werkt.

PackageFamily

Met deze pakketindeling wordt één pakket met platte apps gemaakt met een x64-architectuurpakket en een mediaassetpakket.

Het Element PackageFamily wordt gebruikt om een app-bundel te definiëren. U moet het ManifestPath-kenmerk gebruiken om een AppxManifest voor de bundel op te geven. Het AppxManifest moet overeenkomen met het AppxManifest voor het architectuurpakket van de bundel. Het id-kenmerk moet ook worden opgegeven. Dit wordt gebruikt met MakeAppx.exe tijdens het maken van het pakket, zodat u alleen dit pakket kunt maken als u wilt, en dit is de bestandsnaam van het resulterende pakket. Het kenmerk FlatBundle wordt gebruikt om te beschrijven welk type bundel u wilt maken, waar voor een platte bundel (die u hier meer kunt lezen) en onwaar voor een klassieke bundel. Het kenmerk ResourceManager wordt gebruikt om op te geven of de resourcepakketten in deze bundel MRT gebruiken om toegang te krijgen tot de bestanden. Dit is standaard waar, maar vanaf Windows 10 versie 1803 is dit nog niet gereed, dus dit kenmerk moet worden ingesteld op false.

Pakket en AssetPakket

Binnen PackageFamily worden de pakketten die de app-bundel bevat of verwijzingen bevatten gedefinieerd. Hier wordt het architectuurpakket (ook wel het hoofdpakket genoemd) gedefinieerd met het pakketelement en wordt het assetpakket gedefinieerd met het AssetPackage-element . Het architectuurpakket moet opgeven voor welke architectuur het pakket moet worden gebruikt: 'x64', 'x86', 'arm' of 'neutraal'. U kunt ook (optioneel) rechtstreeks een AppxManifest specifiek voor dit pakket opgeven met behulp van het ManifestPath-kenmerk opnieuw. Als er geen AppxManifest wordt opgegeven, wordt er automatisch een gegenereerd op basis van het AppxManifest dat is opgegeven voor de PackageFamily.

Standaard zal AppxManifest worden gegenereerd voor elk pakket in de bundel. Voor het assetpakket kunt u ook het kenmerk AllowExecution instellen. Als u dit instelt op onwaar (de standaardinstelling), kunt u de publicatietijd voor uw app verminderen, omdat pakketten die niet hoeven te worden uitgevoerd, het publicatieproces niet hebben geblokkeerd door de virusscan (u vindt hier meer informatie over op Inleiding tot assetpakketten).

Bestanden

Binnen elke pakketdefinitie kunt u het element Bestand gebruiken om bestanden te selecteren die in dit pakket moeten worden opgenomen. Het kenmerk SourcePath is de locatie waar de bestanden zich lokaal bevinden. U kunt bestanden uit verschillende mappen selecteren (door relatieve paden op te geven), verschillende stations (door absolute paden op te geven) of zelfs netwerklocaties (door iets als \\myshare\myapp\* op te geven). De DestinationPath is waar de bestanden binnen het pakket zullen eindigen, in relatie tot de hoofdmap van het pakket. ExcludePath kan worden gebruikt (in plaats van de andere twee kenmerken) om bestanden te selecteren die moeten worden uitgesloten van de bestanden die zijn geselecteerd door de SourcePath-kenmerken van andere bestandselementen binnen hetzelfde pakket.

Elk bestandselement kan worden gebruikt om meerdere bestanden te selecteren met behulp van jokertekens. Over het algemeen kan een enkele wildcard (*) een onbeperkt aantal keren overal binnen het pad worden gebruikt. Eén jokerteken komt echter alleen overeen met de bestanden in een map en geen submappen. Bijvoorbeeld, C:\MyGame\*\* kan worden gebruikt in SourcePath om de bestanden C:\MyGame\Audios\UI.mp3 en C:\MyGame\Videos\intro.mp4 te selecteren, maar het kan C:\MyGame\Audios\Level1\warp.mp3 niet selecteren. Het dubbele jokerteken (**) kan ook worden gebruikt in plaats van map- of bestandsnamen om iets recursief te vinden (maar dit kan niet naast gedeeltelijke namen staan). U kunt bijvoorbeeld C:\MyGame\**\Level1\** selecteren C:\MyGame\Audios\Level1\warp.mp3 en C:\MyGame\Videos\Bonus\Level1\DLC1\intro.mp4. Jokertekens kunnen ook worden gebruikt om bestandsnamen rechtstreeks te wijzigen als onderdeel van het verpakkingsproces als de jokertekens op verschillende plaatsen tussen de bron en bestemming worden gebruikt. Als u bijvoorbeeld C:\MyGame\Audios\* voor SourcePath en Sound\copy_* voor DestinationPath selecteert, kan C:\MyGame\Audios\UI.mp3 worden geselecteerd en in het pakket verschijnen als Sound\copy_UI.mp3. Over het algemeen moet het aantal jokertekens en dubbele jokertekens hetzelfde zijn voor het SourcePath en DestinationPath van één bestandselement .

Voorbeeld van geavanceerde verpakkingsindeling

Hier volgt een voorbeeld van een gecompliceerdere verpakkingsindeling:

<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>

Dit voorbeeld verschilt van het eenvoudige voorbeeld met de toevoeging van ResourcePackage - en Optionele elementen.

Resourcepakketten kunnen worden opgegeven met het element ResourcePackage . Binnen resourcepackage moet het element Resources worden gebruikt om de resourcekwalificaties van het resourcepakket op te geven. De resourcekwalificaties zijn de resources die worden ondersteund door het resourcepakket. Hier kunnen we zien dat er twee resourcepakketten zijn gedefinieerd en dat ze elk de Engelse en Franse specifieke bestanden bevatten. Een resourcepakket kan meer dan één kwalificatie hebben. Dit kan worden gedaan door een ander resource-element toe te voegen in Resources. Er moet ook een standaardresource voor de resourcedimensie worden opgegeven als de dimensie bestaat (dimensies zijn taal, schaal, dxfl). Hier kunnen we zien dat Engels de standaardtaal is, wat betekent dat voor gebruikers die geen systeemtaal van Franse set hebben, ze terugvallen op het downloaden van het Engelse resourcepakket en weergeven in het Engels.

Optionele pakketten hebben elk hun eigen unieke pakketfamilienamen en moeten worden gedefinieerd met PackageFamily-elementen, waarbij het attribuut Optional op true moet worden gezet. Het kenmerk RelatedSet wordt gebruikt om op te geven of het optionele pakket zich binnen de gerelateerde set bevindt (standaard is dit waar) - of het optionele pakket moet worden bijgewerkt met het primaire pakket.

Het element PrebuiltPackage wordt gebruikt om pakketten toe te voegen die niet zijn gedefinieerd in de verpakkingsindeling en die moeten worden opgenomen of waarnaar moet worden verwezen in de app-bundelbestanden die worden opgebouwd. In dit geval wordt hier een ander DLC-optioneel pakket opgenomen, zodat het primaire app-bundelbestand ernaar kan verwijzen en deel kan uitmaken van de gerelateerde set.

App-pakketten bouwen met een verpakkingsindeling en MakeAppx.exe

Zodra u de verpakkingsindeling voor uw app hebt, kunt u beginnen met het gebruik van MakeAppx.exe om de pakketten van uw app te bouwen. Als u alle pakketten wilt bouwen die zijn gedefinieerd in de verpakkingsindeling, gebruikt u de opdracht:

MakeAppx.exe build /f PackagingLayout.xml /op OutputPackages\

Maar als u uw app bijwerkt en sommige pakketten geen gewijzigde bestanden bevatten, kunt u alleen de pakketten bouwen die zijn gewijzigd. Met behulp van het eenvoudige voorbeeld van de verpakking op deze pagina en het bouwen van het x64-architectuurpakket, ziet onze opdracht er als volgt uit:

MakeAppx.exe build /f PackagingLayout.xml /id "x64" /ip PreviousVersion\ /op OutputPackages\ /iv

De /id vlag kan worden gebruikt om de pakketten te selecteren die moeten worden gebouwd op basis van de verpakkingsindeling, die overeenkomt met het id-kenmerk in de indeling. Deze /ip wordt gebruikt om aan te geven waar de vorige versie van de pakketten zich in dit geval bevinden. De vorige versie moet worden opgegeven omdat het app-bundelbestand nog steeds moet verwijzen naar de vorige versie van het Media-pakket . De /iv vlag wordt gebruikt om automatisch de versie van de pakketten te verhogen die worden gebouwd (in plaats van de versie in het AppxManifest te wijzigen). Als alternatief kunt u de switches /pv en /bv gebruiken om respectievelijk een pakketversie (voor alle te maken pakketten) en een bundelversie (voor alle bundels die moeten worden gemaakt) rechtstreeks te leveren. Als u met behulp van het geavanceerde voorbeeld van de verpakking op deze pagina alleen de optionele bundel Thema's en het thema.main-app-pakket wilt bouwen waarnaar wordt verwezen, gebruikt u deze opdracht:

MakeAppx.exe build /f PackagingLayout.xml /id "Themes" /op OutputPackages\ /bc /nbp

De /bc vlag wordt gebruikt om aan te geven dat de kinderen van de Thema's bundel ook moeten worden gebouwd (in dit geval wordt Themes.main gebouwd). De /nbp vlag wordt gebruikt om aan te geven dat het bovenliggende element van de bundel Thema's niet mag worden gebouwd. De bovenliggende app-bundel van Thema's, een optionele app-bundel, is de primaire app-bundel: MyGame. Meestal moet voor een optioneel pakket in een gerelateerde set ook de primaire app-bundel worden gebouwd om het optionele pakket te kunnen installeren, omdat er ook naar het optionele pakket wordt verwezen in de primaire app-bundel wanneer het zich in een gerelateerde set bevindt (om versiebeheer tussen de primaire en de optionele pakketten te garanderen). De ouder-kind relatie tussen pakketten wordt geïllustreerd in het volgende diagram.

Indelingsdiagram voor pakketten