자산 패키지 및 패키지 접기를 사용하여 개발Developing with asset packages and package folding

중요

스토어에 앱을 제출 하려면 Windows 개발자 지원 에 문의 하 고 자산 패키지 및 패키지 정리를 사용 하도록 승인을 받아야 합니다.If you intend to submit your app to the Store, you need to contact Windows developer support and get approval to use asset packages and package folding.

자산 패키지는 앱의 전체 패키징 크기 및 게시 시간을 저장소로 줄일 수 있습니다.Asset packages can decrease the overall packaging size and publishing time for your apps to the Store. 자산 패키지에 대해 자세히 알아보고 자산 패키지를 소개하는 방법으로 개발 반복의 속도를 높일 수 있습니다.You can learn more about asset packages and how it can speed up your development iterations at Introduction to asset packages.

앱에 대 한 자산 패키지를 사용 하려는 경우 또는 이미 알고 있는 경우 자산 패키지를 사용 하 여 개발 프로세스를 변경 하는 방법에 대해 궁금할 것입니다.If you are thinking about using asset packages for your app or already know that you want to use it, then you are probably wondering about how asset packages will change your development process. 간단히 말해서 앱 개발은 동일 하 게 유지 됩니다. 자산 패키지에 대 한 패키지 접기 때문에 가능 합니다.In short, app development for you stays the same - this is possible because of package folding for asset packages.

앱을 분할 한 후 파일 액세스File access after splitting your app

패키지를 정리 하 여 개발 프로세스에 영향을 주지 않는 방법을 이해 하려면 먼저 응용 프로그램을 여러 패키지 (자산 패키지 또는 리소스 패키지)로 분할할 때 발생 하는 상황을 이해 하는 것이 좋습니다.To understand how package folding doesn’t impact your development process, let’s step back first to understand what happens when you split your app into multiple packages (with either asset packages or resource packages).

개략적인 수준에서 앱의 일부 파일을 다른 패키지 (아키텍처 패키지 아님)로 분할할 때 코드가 실행 되는 위치에 따라 직접 해당 파일에 액세스할 수 없게 됩니다.At a high level, when you split some of your app’s files into other packages (that are not architecture packages), you will not be able to access those files directly relative to where your code runs. 이러한 패키지는 모두 아키텍처 패키지가 설치 된 위치와 다른 디렉터리에 설치 되기 때문입니다.This is because these packages are all installed into different directories from where your architecture package is installed. 예를 들어 게임을 하 고 프랑스어 및 독일어로 지역화 하 고 x86 및 x64 컴퓨터에 대해 빌드하는 경우 게임의 앱 번들 내에 이러한 앱 패키지 파일이 있어야 합니다.For example, if you’re making a game and your game is localized into French and German and you built for both x86 and x64 machines, then you should have these app package files within the app bundle of your game:

  • MyGame_1 MyGame_1.0_x86. .appxMyGame_1.0_x86.appx
  • MyGame_1 MyGame_1.0_x64. .appxMyGame_1.0_x64.appx
  • MyGame_1 MyGame_1.0_language-fr-frMyGame_1.0_language-fr.appx
  • MyGame_1 MyGame_1.0_languageMyGame_1.0_language-de.appx

게임을 사용자의 컴퓨터에 설치 하는 경우 각 앱 패키지 파일에는 Windowsapps 디렉터리에 자체 폴더가 포함 됩니다.When your game is installed to a user’s machine, each app package file will have its own folder in the WindowsApps directory. 따라서 64 비트 Windows를 실행 하는 프랑스어 사용자의 경우 게임이 다음과 같이 표시 됩니다.So for a French user running 64-bit Windows, your game will look like this:

C:\Program Files\WindowsApps\
|-- MyGame_1.0_x64
|   `-- …
|-- MyGame_1.0_language-fr
|   `-- …
`-- …(other apps)

사용자에 게 적용할 수 없는 앱 패키지 파일 (x86 및 독일어 패키지)은 설치 되지 않습니다.Note that the app package files that are not applicable to the user will not be installed (the x86 and German packages).

이 사용자의 경우 게임의 주 실행 파일은 MyGame_1 폴더에 있으며이 폴더에서 실행 되며 일반적으로이 폴더 내의 파일에만 액세스할 수 있습니다.For this user, your game’s main executable will be within the MyGame_1.0_x64 folder and will run from there, and normally, it will only have access to the files within this folder. MyGame_1 폴더의 파일에 액세스 하려면 mrt.log api를 사용 하거나 PackageManager api를 사용 해야 합니다.In order to access the files in the MyGame_1.0_language-fr folder, you would have to use either the MRT APIs or the PackageManager APIs. MRT.LOG Api는 설치 된 언어에서 가장 적합 한 파일을 자동으로 선택할 수 있으며, Windows의 mrt.log api에 대 한 자세한 내용을 확인할 수 있습니다.The MRT APIs can automatically select the most appropriate file from the languages installed, you can find out more about MRT APIs at Windows.ApplicationModel.Resources.Core. 또는 PackageManager 클래스를 사용 하 여 프랑스어 언어 패키지의 설치 된 위치를 찾을 수 있습니다.Alternatively, you can find the installed location of the French language package using the PackageManager Class. 이는 변경 될 수 있으며 사용자 마다 다를 수 있으므로 응용 프로그램 패키지의 설치 된 위치를 가정해 서는 안 됩니다.You should never assume the installed location of the packages of your app since this can change and can vary between users.

자산 패키지 접기Asset package folding

그렇다면 자산 패키지의 파일에 액세스 하려면 어떻게 해야 하나요?So how can you access the files in your asset packages? 아키텍처 패키지의 다른 파일에 액세스 하는 데 사용 하는 파일 액세스 Api를 계속 사용할 수 있습니다.Well, you can continue to use the file access APIs you are using to access any other file in your architecture package. 이는 자산 패키지 파일이 패키지 정리 프로세스를 통해 설치 될 때 아키텍처 패키지로 접기 되기 때문입니다.This is because asset package files will be folded into your architecture package when it is installed through the package folding process. 또한 자산 패키지 파일은 원래 아키텍처 패키지 내의 파일 이어야 하므로 느슨한 파일 배포에서 배포 프로세스의 패키지 배포로 이동 하는 경우 API 사용을 변경할 필요가 없습니다.Furthermore, since asset package files should originally be files within your architecture packages, this means that you would not have to change API usage when you move from loose files deployment to packaged deployment in your development process.

패키지 접기가 작동 하는 방식에 대 한 자세한 내용은 예제부터 살펴보겠습니다.To understand more about how package folding works, let’s start with an example. 다음 파일 구조를 포함 하는 게임 프로젝트가 있는 경우:If you have a game project with the following file structure:

MyGame
|-- Audios
|   |-- Level1
|   |   `-- ...
|   `-- Level2
|       `-- ...
|-- Videos
|   |-- Level1
|   |   `-- ...
|   `-- Level2
|       `-- ...
|-- Engine
|   `-- ...
|-- XboxLive
|   `-- ...
`-- Game.exe

게임을 3 개의 패키지 (x64 아키텍처 패키지, 오디오를 위한 자산 패키지 및 비디오에 대 한 자산 패키지)로 분할 하려는 경우 게임은 다음 패키지로 나뉩니다.If you want to split your game into 3 packages: an x64 architecture package, an asset package for audios, and an asset package for videos, your game will be divided into these packages:

MyGame_1.0_x64.appx
|-- Engine
|   `-- ...
|-- XboxLive
|   `-- ...
`-- Game.exe
MyGame_1.0_Audios.appx
`-- Audios
    |-- Level1
    |   `-- ...
    `-- Level2
        `-- ...
MyGame_1.0_Videos.appx
`-- Videos
    |-- Level1
    |   `-- ...
    `-- Level2
        `-- ...

게임을 설치할 때 x64 패키지가 먼저 배포 됩니다.When you install your game, the x64 package will be deployed first. 그러면 앞의 예제에서 MyGame_1 와 마찬가지로 두 자산 패키지가 자신의 폴더에 계속 배포 됩니다.Then the two asset packages will still be deployed to their own folders, just like MyGame_1.0_language-fr from our previous example. 그러나 패키지 접기로 인해 자산 패키지 파일도 MyGame_1 폴더에 표시 되도록 하드 링크 됩니다 . 즉, 파일이 두 위치에 표시 되더라도 디스크 공간을 두 번 차지 하지 않습니다.However, because of package folding, the asset package files will also be hard linked to appear in the MyGame_1.0_x64 folder (so even though the files appear in two locations, they do not take up twice the disk space). 자산 패키지 파일이 표시 되는 위치는 패키지 루트를 기준으로 하는 위치와 정확히 일치 합니다.The location in which the asset package files will appear in is exactly the location that they are at relative to the root of the package. 따라서 배포 된 게임의 최종 레이아웃은 다음과 같습니다.So here’s what the final layout of the deployed game will look like:

C:\Program Files\WindowsApps\
|-- MyGame_1.0_x64
|   |-- Audios
|   |   |-- Level1
|   |   |   `-- ...
|   |   `-- Level2
|   |       `-- ...
|   |-- Videos
|   |   |-- Level1
|   |   |   `-- ...
|   |   `-- Level2
|   |       `-- ...
|   |-- Engine
|   |   `-- ...
|   |-- XboxLive
|   |   `-- ...
|   `-- Game.exe
|-- MyGame_1.0_Audios
|   `-- Audios
|       |-- Level1
|       |   `-- ...
|       `-- Level2
|           `-- ...
|-- MyGame_1.0_Videos
|   `-- Videos
|       |-- Level1
|       |   `-- ...
|       `-- Level2
|           `-- ...
`-- …(other apps)

자산 패키지에 대해 패키지 정리를 사용 하는 경우 동일한 방식으로 자산 패키지로 분할 한 파일에 계속 액세스할 수 있습니다. 아키텍처 폴더는 원래 프로젝트 폴더와 정확히 동일한 구조를 가지 며, 자산 패키지를 추가 하거나 코드에 영향을 주지 않고 자산 패키지 간에 파일을 이동할 수 있습니다.When using package folding for asset packages, you can still access the files you’ve split into asset packages the same way (notice that the architecture folder has the exact same structure as the original project folder), and you can add asset packages or move files between asset packages without impacting your code.

이제 더 복잡 한 패키지 접기 예제가 있습니다.Now for a more complicated package folding example. 대신 수준에 따라 파일을 분할 하는 것이 좋습니다. 원본 프로젝트 폴더와 동일한 구조를 유지 하려는 경우 패키지는 다음과 같습니다.Let’s say that you want to split your files based on level instead, and if you want to keep the same structure as the original project folder, your packages should look like this:

MyGame_1.0_x64.appx
|-- Engine
|   `-- ...
|-- XboxLive
|   `-- ...
`-- Game.exe
MyGame_Level1.appx
|-- Audios
|   `-- Level1
|       `-- ...
`-- Videos
    `-- Level1
        `-- ...

MyGame_Level2.appx
|-- Audios
|   `-- Level2
|       `-- ...
`-- Videos
    `-- Level2
        `-- ...

이렇게 하면 패키지를 정리 하는 동안 MyGame_Level1 패키지의 Level1 폴더 및 파일과 MyGame_Level2 패키지 의 폴더 및 파일을 통합 os비디오 폴더에 병합할 수 있습니다.This will allow the Level1 folders and files in the MyGame_Level1 package and Level2 folders and files in the MyGame_Level2 package to be merged into the Audios and Videos folders during package folding. 따라서 일반적인 규칙으로, 매핑 파일의 패키지 파일 또는 MakeAppx.exe에 대 한 패키징 레이아웃 에 지정 된 상대 경로는 패키지 정리 후에 액세스 하는 데 사용 해야 하는 경로입니다.So as a general rule, the relative path designated for packaged files in the mapping file or packaging layout for MakeAppx.exe is the path you should use to access them after package folding.

마지막으로, 동일한 상대 경로를 가진 다른 자산 패키지에 두 개의 파일이 있는 경우 패키지를 정리 하는 동안 충돌이 발생 합니다.Lastly, if there are two files in different asset packages that have the same relative paths, this will cause a collision during package folding. 충돌이 발생 하면 앱을 배포 하면 오류가 발생 하 고 실패 합니다.If a collision occurs, the deployment of your app will result in an error and fail. 또한 패키지 정리는 하드 링크를 활용 하기 때문에 자산 패키지를 사용 하는 경우 NTFS가 아닌 드라이브에 앱을 배포할 수 없습니다.Also, because package folding takes advantage of hard links, if you do use asset packages, your app will not be able to be deployed to non-NTFS drives. 사용자가 앱을 이동식 드라이브로 이동 하는 것을 알고 있는 경우 자산 패키지를 사용 하면 안 됩니다.If you know your app will likely be moved to removable drives by your users, then you should not use asset packages.