Aracılığıyla paylaş


Paketleme düzeniyle paket oluşturma

Varlık paketlerinin kullanıma sunulmasıyla birlikte geliştiriciler artık daha fazla paket türüne ek olarak daha fazla paket oluşturmaya yönelik araçlara sahip. Bir uygulama büyüdükçe ve daha karmaşık hale geldikçe, genellikle daha fazla paketlerden oluşur ve bu paketleri yönetme zorluğu artar (özellikle Visual Studio'nun dışında oluşturup eşleme dosyalarını kullanıyorsanız). Bir uygulamanın paketleme yapısının yönetimini basitleştirmek için MakeAppx.exetarafından desteklenen paketleme düzenini kullanabilirsiniz.

Paketleme düzeni, uygulamanın paketleme yapısını açıklayan tek bir XML belgesidir. Bir uygulamanın paketlerini (birincil ve isteğe bağlı), paketlerdeki paketleri ve paketlerdeki dosyaları belirtir. Dosyalar farklı klasörler, sürücüler ve ağ konumlarından seçilebilir. Joker karakterler dosyaları seçmek veya hariç tutmak için kullanılabilir.

Bir uygulamanın paketleme düzeni ayarlandıktan sonra, tek bir komut satırı çağrısında bir uygulamanın tüm paketlerini oluşturmak için MakeAppx.exe ile birlikte kullanılır. Paket yapısını dağıtım gereksinimlerinize uyacak şekilde değiştirmek için paketleme düzeni düzenlenebilir.

Basit paketleme düzeni örneği

Basit bir paketleme düzeninin nasıl göründüğüne bir örnek aşağıda verilmiştir:

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

Bu örneği anlamak için nasıl çalıştığını inceleyelim.

PackageFamily

Bu paketleme düzeni, x64 mimari paketi ve "Medya" varlık paketi ile tek bir düz uygulama paket dosyası oluşturur.

PackageFamily öğesi, bir uygulama paketini tanımlamak için kullanılır. Paket için bir AppxManifest sağlamak için ManifestPath özniteliğini kullanmanız gerekir; AppxManifest, paketin mimari paketi için AppxManifest'e karşılık gelir. Id özniteliği de sağlanmalıdır. Bu, paket oluşturma sırasında MakeAppx.exe ile birlikte kullanılır, böylece isterseniz yalnızca bu paketi oluşturabilirsiniz ve sonuçta elde edilen paketin dosya adı olur. FlatBundle özniteliği, oluşturmak istediğiniz paket türünü açıklamak için kullanılır, düz bir paket için geçerlidir (burada daha fazla bilgi edinebilirsiniz) ve klasik paket için false. ResourceManager özniteliği, bu paketteki kaynak paketlerinin dosyalara erişmek için MRT kullanıp kullanmayacağını belirtmek için kullanılır. Bu varsayılan olarak doğrudur, ancak Windows 10, sürüm 1803 itibarıyla bu henüz hazır değildir, bu nedenle bu öznitelik false olarak ayarlanmalıdır.

Paket ve VarlıkPaketi

PackageFamily içinde, uygulama paketinin içerdiği paketler veya başvurular tanımlanır. Burada, mimari paketi (ana paket olarak da adlandırılır) Package öğesiyle tanımlanır ve varlık paketi AssetPackage öğesiyle tanımlanır. Mimari paketi, paketin hangi mimari için olduğunu belirtmelidir; "x64", "x86", "arm" veya "nötr". ManifestPath özniteliğini yeniden kullanarak da (isteğe bağlı olarak) bu paket için özel olarak bir AppxManifest sağlayabilirsiniz. AppxManifest sağlanmazsa, PackageFamily için sağlanan AppxManifest'ten otomatik olarak bir tane oluşturulur.

Varsayılan olarak, paket içindeki her paket için AppxManifest oluşturulur. Varlık paketi için AllowExecution özniteliğini de ayarlayabilirsiniz. Bu ayarın false (varsayılan) olarak ayarlanması uygulamanızın yayımlama süresini azaltmaya yardımcı olur çünkü yürütülmesi gerekmeyen paketlerde virüs taraması yayımlama işlemini engellemez ( varlık paketlerine giriş bölümünden bu konuda daha fazla bilgi edinebilirsiniz).

Dosyalar

Her paket tanımında Dosya öğesini kullanarak bu pakete eklenecek dosyaları seçebilirsiniz. SourcePath özniteliği, dosyaların yerel olarak bulunduğu yerdir. Farklı klasörlerdeki dosyaları (göreli yollar sağlayarak), farklı sürücülerden (mutlak yollar sağlayarak) ve hatta ağ paylaşımlarından (gibi \\myshare\myapp\*bir şey sağlayarak) seçebilirsiniz. DestinationPath, dosyaların paket köküne göre paket içinde sonlanacağı yerdir. ExcludePath , aynı paket içindeki diğer Dosya öğelerinin SourcePath öznitelikleri tarafından seçilenlerden dışlanacak dosyaları seçmek için (diğer iki öznitelik yerine) kullanılabilir.

Her Dosya öğesi joker karakterler kullanılarak birden çok dosya seçmek için kullanılabilir. Genel olarak, tek joker karakter (*) yolun içinde herhangi bir yerde birkaç kez kullanılabilir. Ancak, tek bir joker karakter yalnızca klasör içindeki dosyalarla eşleşecek ve alt klasörlerle eşleşmeyecektir. Örneğin, C:\MyGame\*\* SourcePath öğesinde ve C:\MyGame\Audios\UI.mp3 dosyalarını seçmek için kullanılabilir, ancak C:\MyGame\Videos\intro.mp4 öğesini seçemez. Çift joker karakter (**), klasör veya dosya adlarının yerine herhangi bir şeyi özyinelemeli olarak eşleştirmek için de kullanılabilir (ancak kısmi adların yanında olamaz). Örneğin, C:\MyGame\**\Level1\**C:\MyGame\Audios\Level1\warp.mp3 ve C:\MyGame\Videos\Bonus\Level1\DLC1\intro.mp4 öğesini seçebilirsiniz. Joker karakterler, kaynak ve hedef arasındaki farklı yerlerde kullanılıyorsa, paketleme işleminin bir parçası olarak dosya adlarını doğrudan değiştirmek için de kullanılabilir. Örneğin, C:\MyGame\Audios\* için ve Sound\copy_* için kullanıldığında, C:\MyGame\Audios\UI.mp3 seçilip pakette Sound\copy_UI.mp3 olarak görünebilir. Genel olarak, tek bir Dosya öğesinin SourcePath ve DestinationPath için tek joker karakter ve çift joker karakter sayısı aynı olmalıdır.

Gelişmiş paketleme düzeni örneği

Aşağıda daha karmaşık bir paketleme düzeni örneği verilmiştir:

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

Bu örnek, ResourcePackage ve İsteğe bağlı öğelerinin eklenmesiyle basit örnekten farklıdır.

Kaynak paketleri ResourcePackage öğesiyle belirtilebilir. ResourcePackage içinde Resources öğesi, kaynak paketinin kaynak niteleyicilerini belirtmek için kullanılmalıdır. Kaynak niteleyicileri kaynak paketi tarafından desteklenen kaynaklardır. Burada iki kaynak paketi tanımlandığını ve bunların her birinin İngilizce ve Fransızcaya özgü dosyaları içerdiğini görebiliriz. Bir kaynak paketi birden fazla niteleyiciye sahip olabilir; bu, Kaynaklar'a başka bir Kaynak öğesi eklenerek yapılabilir. Kaynak boyutu varsa (boyutlar dil, ölçek, dxfl), kaynak boyutu için varsayılan bir kaynak da belirtilmelidir. Burada, İngilizcenin varsayılan dil olduğunu görebiliriz, yani sistem dili Fransızca olarak ayarlanmamış kullanıcılar İngilizce kaynak paketini indirir ve içeriği İngilizce olarak görüntüler.

İsteğe bağlı paketlerin her birinin kendi ayrı paket ailesi adları vardır ve İsteğe bağlı özniteliği true olarak belirtilirken PackageFamily öğeleriyle tanımlanmalıdır. RelatedSet özniteliği, isteğe bağlı paketin ilişkili küme içinde olup olmadığını (varsayılan olarak bu doğru) belirtmek için kullanılır; isteğe bağlı paketin birincil paketle güncelleştirilip güncelleştirilmeyeceği.

PrebuiltPackage öğesi, oluşturulacak uygulama paket dosyalarına dahil edilecek veya başvurulacak paketleme düzeninde tanımlanmayan paketler eklemek için kullanılır. Bu durumda, birincil uygulama paketi dosyasının buna başvurabilmesi ve ilgili kümenin bir parçası olmasını sağlayan başka bir DLC isteğe bağlı paketi buraya eklenmektedir.

"Uygulama paketlerini bir paketleme düzeni ve MakeAppx.exe ile oluştur"

Uygulamanızın paketleme düzenine sahip olduktan sonra uygulamanızın paketlerini oluşturmak için MakeAppx.exe kullanmaya başlayabilirsiniz. Paketleme düzeninde tanımlanan tüm paketleri oluşturmak için komutunu kullanın:

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

Ancak, uygulamanızı güncelleştiriyorsanız ve bazı paketler değiştirilmiş dosya içermiyorsa, yalnızca değiştirilen paketleri oluşturabilirsiniz. Bu sayfadaki basit paketleme düzeni örneğini kullanarak ve x64 mimari paketini oluşturarak komutumuz şöyle görünür:

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

Bayrağı /id , düzendeki ID özniteliğine karşılık gelen paketleme düzeninden oluşturulacak paketleri seçmek için kullanılabilir. /ip, bu durumda paketlerin önceki sürümünün nerede olduğunu belirtmek için kullanılır. Uygulama paketi dosyasının media paketinin önceki sürümüne başvurması gerektiğinden önceki sürüm sağlanmalıdır. bayrağı /iv , oluşturulan paketlerin sürümünü otomatik olarak artırmak için kullanılır ( AppxManifest'teki sürümü değiştirmek yerine). Alternatif olarak, anahtarlar /pv ve /bv sırasıyla doğrudan bir paket sürümü (oluşturulacak tüm paketler için) ve bir demet sürümü (oluşturulacak tüm demetler için) sağlamak için kullanılabilir. Bu sayfadaki ileri düzey paketleme düzeni örneğini kullanarak, yalnızca Themes isteğe bağlı paketini ve referans verdiği Themes.main uygulama paketini oluşturmak istiyorsanız, şu komutu kullanabilirsiniz:

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

/bc bayrağı, Temalar paketinin alt öğelerinin de derlenmesi gerektiğini belirtmek için kullanılır (bu durumda Themes.main derlenecektir). /nbp Bayrağı, Temalar paketinin üst öğesinin oluşturulmaması gerektiğini belirtmek için kullanılır. İsteğe bağlı bir uygulama paketi olan Temaların üst öğesi birincil uygulama paketidir: MyGame. genellikle ilgili bir kümedeki isteğe bağlı bir paket için, isteğe bağlı paketin yüklenebilmesi için birincil uygulama paketinin de derlenmesi gerekir, çünkü isteğe bağlı paket, ilgili bir kümede olduğunda birincil uygulama paketine de başvurulur (birincil ve isteğe bağlı paketler arasında sürüm oluşturmayı garanti etmek için). Paketler arasındaki ebeveyn-çocuk ilişkisi aşağıdaki diyagramda gösterilmiştir.

Paketleme Düzeni Diyagramı