자산 패키지 및 패키지 접기를 사용하여 개발

Important

스토어에 앱을 제출하려면 Windows 개발자 지원에 문의하고 자산 패키지 및 패키지 접기를 사용하도록 승인을 받아야 합니다.

자산 패키지는 스토어에 대한 앱의 전체 패키징 크기 및 게시 시간을 줄일 수 있습니다. 자산 패키지 소개에서 자산 패키지 및 개발 반복 속도를 높이는 방법에 대해 자세히 알아볼 수 있습니다.

앱에 자산 패키지를 사용하는 방법을 생각하거나 이미 사용하려는 경우 자산 패키지가 개발 프로세스를 어떻게 변경할지 궁금할 것입니다. 요컨대, 앱 개발은 동일하게 유지됩니다. 자산 패키지에 대한 패키지 접기 때문에 가능합니다.

앱을 분할한 후 파일 액세스

패키지 폴딩이 개발 프로세스에 영향을 주지 않는 방식을 이해하려면 먼저 한 걸음 뒤로 물러서서 앱을 여러 패키지(자산 패키지 또는 리소스 패키지 포함)로 분할할 때 발생하는 일을 이해해 보겠습니다.

높은 수준에서 앱의 일부 파일을 아키텍처 패키지가 아닌 다른 패키지로 분할하면 코드가 실행되는 위치를 기준으로 해당 파일에 직접 액세스할 수 없습니다. 이러한 패키지는 모두 아키텍처 패키지가 설치된 다른 디렉터리에 설치되기 때문입니다. 예를 들어 게임을 만들고 있고 게임이 프랑스어와 독일어로 지역화되고 x86 및 x64 컴퓨터용으로 빌드된 경우 게임의 앱 번들 내에 이러한 앱 패키지 파일이 있어야 합니다.

  • MyGame_1.0_x86.appx
  • MyGame_1.0_x64.appx
  • MyGame_1.0_language-fr.appx
  • MyGame_1.0_language-de.appx

게임이 사용자의 컴퓨터에 설치되면 각 앱 패키지 파일은 WindowsApps 디렉터리에 자체 폴더를 갖습니다 . 따라서 64비트 Windows를 실행하는 프랑스 사용자의 경우 게임은 다음과 같이 표시됩니다.

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

사용자에게 적용되지 않는 앱 패키지 파일은 설치되지 않습니다(x86 및 독일어 패키지).

이 사용자의 경우 게임의 기본 실행 파일은 MyGame_1.0_x64 폴더 내에 있으며 여기에서 실행되며 일반적으로 이 폴더 내의 파일에만 액세스할 수 있습니다. MyGame_1.0_language-fr 폴더의 파일에 액세스하려면 MRT API 또는 PackageManager API를 사용해야 합니다. MRT API는 설치된 언어에서 가장 적절한 파일을 자동으로 선택할 수 있으며, Windows.ApplicationModel.Resources.Core에서 MRT API에 대해 자세히 알아볼 수 있습니다. 또는 PackageManager 클래스를 사용하여 프랑스어 패키지의 설치된 위치를 찾을 수 있습니다. 변경될 수 있고 사용자마다 다를 수 있으므로 앱 패키지의 설치된 위치를 가정해서는 안 됩니다.

자산 패키지 접기

그렇다면 자산 패키지의 파일에 액세스하려면 어떻게 해야 할까요? 글쎄, 아키텍처 패키지의 다른 파일에 액세스하는 데 사용하는 파일 액세스 API를 계속 사용할 수 있습니다. 이는 자산 패키지 파일이 패키지 접기 프로세스를 통해 설치될 때 아키텍처 패키지로 접기되기 때문입니다. 또한 자산 패키지 파일은 원래 아키텍처 패키지 내의 파일이어야 하므로 개발 프로세스에서 느슨한 파일 배포에서 패키지된 배포로 이동할 때 API 사용량을 변경할 필요가 없습니다.

패키지 폴딩의 작동 방식에 대해 자세히 알아보려면 예제부터 시작해 보겠습니다. 다음 파일 구조를 가진 게임 프로젝트가 있는 경우:

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

게임을 x64 아키텍처 패키지, 오디오용 자산 패키지, 비디오용 자산 패키지 등 3개의 패키지로 분할하려는 경우 게임은 다음 패키지로 나뉩니다.

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 패키지가 먼저 배포됩니다. 그런 다음 두 자산 패키지는 이전 예제의 MyGame_1.0_language-fr과 마찬가지로 자체 폴더에 계속 배포됩니다. 그러나 패키지 폴딩으로 인해 자산 패키지 파일도 MyGame_1.0_x64 폴더에 표시하기 어렵게 연결됩니다(따라서 파일이 두 위치에 표시되더라도 디스크 공간의 두 배는 차지하지 않음). 자산 패키지 파일이 표시되는 위치는 패키지의 루트를 기준으로 하는 위치입니다. 배포된 게임의 최종 레이아웃은 다음과 같습니다.

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)

자산 패키지에 패키지 폴딩을 사용하는 경우 자산 패키지로 분할한 파일(아키텍처 폴더의 구조가 원래 프로젝트 폴더와 정확히 동일함)에 계속 액세스할 수 있으며 코드에 영향을 주지 않고 자산 패키지를 추가하거나 자산 패키지 간에 파일을 이동할 수 있습니다.

이제 더 복잡한 패키지 접기 예제를 참조하세요. 대신 수준에 따라 파일을 분할하고 원래 프로젝트 폴더와 동일한 구조를 유지하려는 경우 패키지는 다음과 같이 표시됩니다.

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 패키지의 Level2 폴더 및 파일이 패키지 폴딩 중에 오디오비디오 폴더에 병합될 수 있습니다. 따라서 일반적으로 MakeAppx.exe의 매핑 파일 또는 패키징 레이아웃 에서 패키지된 파일에 대해 지정된 상대 경로는 패키지 폴딩 후 액세스하는 데 사용해야 하는 경로입니다.

마지막으로 서로 다른 자산 패키지에 상대 경로가 같은 두 개의 파일이 있는 경우 패키지 폴딩 중에 충돌이 발생합니다. 충돌이 발생하면 앱의 배포로 인해 오류가 발생하고 실패합니다. 또한 패키지 접기가 하드 링크를 활용하기 때문에 자산 패키지를 사용하는 경우 앱은 NTFS가 아닌 드라이브에 배포할 수 없습니다. 사용자가 앱을 이동식 드라이브로 이동할 가능성이 높다는 것을 알고 있는 경우 자산 패키지를 사용하면 안 됩니다.