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

중요

스토어에 앱을 제출하려는 경우 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 MRT API에 대해 자세히 알아볼 수 있습니다. ApplicationModel.Resources.Core. 또는 PackageManager 클래스를 사용하여 프랑스어 패키지의 설치된 위치를 찾을 수 있습니다. 앱 패키지의 설치된 위치는 변경될 수 있으며 사용자마다 다를 수 있으므로 가정해서는 안 됩니다.

자산 패키지 폴딩

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

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

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

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

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

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