Pembuatan paket dengan tata letak kemasan

Dengan pengenalan paket aset, pengembang sekarang memiliki alat untuk membangun lebih banyak paket selain lebih banyak jenis paket. Karena aplikasi semakin besar dan lebih kompleks, aplikasi akan sering terdiri dari lebih banyak paket, dan kesulitan mengelola paket ini akan meningkat (terutama jika Anda membangun di luar Visual Studio dan menggunakan file pemetaan). Untuk menyederhanakan manajemen struktur kemasan aplikasi, Anda dapat menggunakan tata letak kemasan yang didukung oleh MakeAppx.exe.

Tata letak kemasan adalah dokumen XML tunggal yang menjelaskan struktur pengemasan aplikasi. Ini menentukan bundel aplikasi (primer dan opsional), paket dalam bundel, dan file dalam paket. File dapat dipilih dari folder, drive, dan lokasi jaringan yang berbeda. Kartubebas dapat digunakan untuk memilih atau mengecualikan file.

Setelah tata letak pengemasan untuk aplikasi disiapkan, tata letak tersebut digunakan dengan MakeAppx.exe untuk membuat semua paket untuk aplikasi dalam satu panggilan baris perintah. Tata letak kemasan dapat diedit untuk mengubah struktur paket agar sesuai dengan kebutuhan penyebaran Anda.

Contoh tata letak kemasan sederhana

Berikut adalah contoh tampilan tata letak kemasan sederhana:

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

Mari kita uraikan contoh ini untuk memahami cara kerjanya.

PackageFamily

Tata letak kemasan ini akan membuat satu file bundel aplikasi datar dengan paket arsitektur x64 dan paket aset "Media".

Elemen PackageFamily digunakan untuk menentukan app bundle. Anda harus menggunakan atribut ManifestPath untuk menyediakan AppxManifest untuk bundel, AppxManifest harus sesuai dengan AppxManifest untuk paket arsitektur bundel. Atribut ID juga harus disediakan. Ini digunakan dengan MakeAppx.exe selama pembuatan paket sehingga Anda dapat membuat paket ini hanya jika mau, dan ini akan menjadi nama file dari paket yang dihasilkan. Atribut FlatBundle digunakan untuk menjelaskan jenis bundel apa yang ingin Anda buat, true untuk bundel datar (yang dapat Anda baca lebih lanjut di sini), dan false untuk bundel klasik. Atribut ResourceManager digunakan untuk menentukan apakah paket sumber daya dalam bundel ini akan menggunakan MRT untuk mengakses file. Ini secara default benar, tetapi pada Windows 10, versi 1803, ini belum siap, sehingga atribut ini harus diatur ke false.

Paket dan AssetPackage

Dalam PackageFamily, paket yang berisi app bundle atau referensi ditentukan. Di sini, paket arsitektur (juga disebut paket utama) didefinisikan dengan elemen Paket , dan paket aset didefinisikan dengan elemen AssetPackage . Paket arsitektur harus menentukan arsitektur mana yang digunakan paket, baik "x64", "x86", "arm", atau "netral". Anda juga dapat (opsional) secara langsung menyediakan AppxManifest khusus untuk paket ini dengan menggunakan atribut ManifestPath lagi. Jika AppxManifest tidak disediakan, appxManifest akan dibuat secara otomatis dari AppxManifest yang disediakan untuk PackageFamily.

Secara default dan AppxManifest akan dibuat untuk setiap paket dalam bundel. Untuk paket aset, Anda juga dapat mengatur atribut AllowExecution . Mengatur ini ke false (default), akan membantu mengurangi waktu penerbitan untuk aplikasi Anda karena paket yang tidak perlu dijalankan tidak akan memblokir pemindaian virus mereka untuk proses penerbitan (Anda dapat mempelajari lebih lanjut tentang ini di Pengenalan paket aset).

File

Dalam setiap definisi paket, Anda dapat menggunakan elemen File untuk memilih file yang akan disertakan dalam paket ini. Atribut SourcePath adalah tempat file berada secara lokal. Anda dapat memilih file dari folder yang berbeda (dengan menyediakan jalur relatif), drive yang berbeda (dengan menyediakan jalur absolut), atau bahkan berbagi jaringan (dengan menyediakan sesuatu seperti \\myshare\myapp\*). DestinationPath adalah tempat file akan berakhir dalam paket, relatif terhadap akar paket. ExcludePath dapat digunakan (alih-alih dua atribut lainnya) untuk memilih file yang akan dikecualikan dari yang dipilih oleh atribut SourcePath elemen File lainnya dalam paket yang sama.

Setiap elemen File dapat digunakan untuk memilih beberapa file dengan menggunakan kartubebas. Secara umum, kartubebas tunggal (*) dapat digunakan di mana saja dalam jalur berapa kali. Namun, satu kartubebas hanya akan cocok dengan file dalam folder dan bukan subfolder apa pun. Misalnya, C:\MyGame\*\* dapat digunakan di SourcePath untuk memilih file C:\MyGame\Audios\UI.mp3 dan C:\MyGame\Videos\intro.mp4, tetapi tidak dapat memilih C:\MyGame\Audios\Level1\warp.mp3. Kartubebas ganda (**) juga dapat digunakan sebagai pengganti nama folder atau file untuk mencocokkan apa pun secara rekursif (tetapi tidak dapat berada di samping nama parsial). Misalnya, C:\MyGame\**\Level1\** dapat memilih C:\MyGame\Audios\Level1\warp.mp3 dan C:\MyGame\Videos\Bonus\Level1\DLC1\intro.mp4. Kartubebas juga dapat digunakan untuk langsung mengubah nama file sebagai bagian dari proses pengemasan jika wildcard digunakan di tempat yang berbeda antara sumber dan tujuan. Misalnya, memiliki C:\MyGame\Audios\* untuk SourcePath dan Sound\copy_* untuk DestinationPath dapat memilih C:\MyGame\Audios\UI.mp3 dan membuatnya muncul dalam paket sebagai Sound\copy_UI.mp3. Secara umum, jumlah kartubebas tunggal dan kartubebas ganda harus sama untuk SourcePath dan DestinationPath dari satu elemen File .

Contoh tata letak kemasan tingkat lanjut

Berikut adalah contoh tata letak kemasan yang lebih rumit:

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

Contoh ini berbeda dari contoh sederhana dengan penambahan elemen ResourcePackage dan Opsional .

Paket sumber daya dapat ditentukan dengan elemen ResourcePackage . Dalam ResourcePackage, elemen Sumber Daya harus digunakan untuk menentukan kualifikasi sumber daya dari paket sumber daya. Kualifikasi sumber daya adalah sumber daya yang didukung oleh paket sumber daya, di sini, kita dapat melihat bahwa ada dua paket sumber daya yang ditentukan dan masing-masing berisi file spesifik Bahasa Inggris dan Prancis. Paket sumber daya dapat memiliki lebih dari satu kualifikasi, ini dapat dilakukan dengan menambahkan elemen Sumber Daya lain dalam Sumber Daya. Sumber daya default untuk dimensi sumber daya juga harus ditentukan jika dimensi ada (dimensi menjadi bahasa, skala, dxfl). Di sini, kita dapat melihat bahwa bahasa Inggris adalah bahasa default, yang berarti bahwa untuk pengguna yang tidak memiliki bahasa sistem set Prancis, mereka akan mundur untuk mengunduh paket sumber daya bahasa Inggris dan ditampilkan dalam bahasa Inggris.

Paket opsional masing-masing memiliki nama keluarga paket mereka sendiri yang berbeda dan harus didefinisikan dengan elemen PackageFamily , sambil menentukan atribut Opsional menjadi benar. Atribut RelatedSet digunakan untuk menentukan apakah paket opsional berada dalam set terkait (secara default ini benar) – apakah paket opsional harus diperbarui dengan paket utama.

Elemen PrebuiltPackage digunakan untuk menambahkan paket yang tidak ditentukan dalam tata letak kemasan untuk disertakan atau dirujuk dalam file bundel aplikasi yang akan dibuat. Dalam hal ini, paket opsional DLC lain sedang disertakan di sini sehingga file bundel aplikasi utama dapat mereferensikannya dan memilikinya menjadi bagian dari set terkait.

Membuat paket aplikasi dengan tata letak kemasan dan MakeAppx.exe

Setelah memiliki tata letak kemasan untuk aplikasi, Anda dapat mulai menggunakan MakeAppx.exe untuk membuat paket aplikasi Anda. Untuk membangun semua paket yang ditentukan dalam tata letak kemasan, gunakan perintah :

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

Namun, jika Anda memperbarui aplikasi dan beberapa paket tidak berisi file yang diubah, Anda hanya dapat membuat paket yang telah berubah. Menggunakan contoh tata letak kemasan sederhana di halaman ini dan membangun paket arsitektur x64, inilah yang akan terlihat seperti perintah kami:

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

Bendera /id dapat digunakan untuk memilih paket yang akan dibangun dari tata letak kemasan, sesuai dengan atribut ID dalam tata letak. /ip digunakan untuk menunjukkan di mana versi paket sebelumnya berada dalam kasus ini. Versi sebelumnya harus disediakan karena file bundel aplikasi masih perlu mereferensikan versi paket Media sebelumnya. Bendera /iv digunakan untuk secara otomatis meningkatkan versi paket yang sedang dibangun (alih-alih mengubah versi di AppxManifest). Atau, sakelar /pv dan /bv dapat digunakan untuk secara langsung menyediakan versi paket (agar semua paket dibuat) dan versi bundel (untuk semua bundel yang akan dibuat), masing-masing. Menggunakan contoh tata letak kemasan tingkat lanjut di halaman ini, jika Anda hanya ingin membuat bundel opsional Tema dan paket aplikasi Themes.main yang dirujuknya, Anda akan menggunakan perintah ini:

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

Bendera /bc digunakan untuk menunjukkan bahwa anak-anak bundel Tema juga harus dibangun (dalam hal ini Tema.main akan dibangun). Bendera /nbp digunakan untuk menunjukkan bahwa induk bundel Tema tidak boleh dibuat. Induk Tema, yang merupakan bundel aplikasi opsional, adalah bundel aplikasi utama: MyGame. Biasanya untuk paket opsional dalam set terkait, bundel aplikasi utama juga harus dibuat agar paket opsional dapat diinstal, karena paket opsional juga dirujuk dalam bundel aplikasi utama ketika berada dalam set terkait (untuk menjamin penerapan versi antara paket utama dan opsional). Hubungan anak induk antar paket diilustrasikan dalam diagram berikut:

Packaging Layout Diagram