리소스 팩 대신 앱 패키지에 리소스 빌드

몇 가지 종류의 앱(다국어 사전, 번역 도구 등)은 앱 번들의 기본 동작을 재정의하고, 리소스를 별도의 리소스 패키지(또는 리소스 팩)에 포함하지 않고 앱 패키지에 빌드해야 합니다. 이 문서에서는 이러한 작업을 수행하는 방법에 대해 설명합니다.

기본적으로 앱 번들(.appxbundle)을 빌드하는 경우 언어, 스케일링, DirectX 기능 수준에 대한 기본 리소스만 앱 패키지에 빌드됩니다. 번역된 리소스 및 기본 이외 크기에 맞게 조정된 리소스 및/또는 DirectX 기능 수준은 리소스 패키지에 내장되어 있으며, 필요한 디바이스에만 다운로드됩니다. 고객이 언어 기본 설정이 스페인어인 디바이스를 사용하여 Microsoft Store에서 앱을 구매하는 경우 앱과 스페인어 리소스 패키지만 다운로드 및 설치됩니다. 동일한 사용자가 나중에 설정에서 언어 기본 설정을 프랑스어로 변경하는 경우 앱의 프랑스어 리소스 패키지가 다운로드 및 설치됩니다. 크기 및 DirectX 기능 수준에 대한 기준을 충족하는 리소스에 유사한 상황이 발생합니다. 대부분의 앱에서 이 동작은 중요한 효율성을 구성하며 개발자와 고객이 원하는 것입니다.

그러나 설정을 통하지 않고 앱 내에서 즉시 언어를 변경하도록 허용하는 앱의 경우 해당 기본 동작은 적절치 않습니다. 이러한 경우 모든 언어 리소스를 앱과 함께 한 번에 조건 없이 다운로드 및 설치한 다음 디바이스에 남겨 놓길 원할 것입니다. 리소스 모두를 별도의 리소스 패키지가 아닌 앱 패키지에 빌드하고자 할 것입니다.

참고 앱 패키지에 리소스를 포함하면 앱의 크기가 기본적으로 증가하게 됩니다. 따라서 앱의 특성 상 필요한 경우에만 해당 작업을 수행하는 것이 좋습니다. 필요하지 않은 경우에는 평소대로 일반 앱 번들만 빌드하면 됩니다.

Visual Studio가 앱 패키지에 리소스를 빌드하도록 구성하는 데에는 두 가지 방법이 있습니다. 구성 파일을 프로젝트에 추가하거나 프로젝트 파일을 직접 편집할 수 있습니다. 이러한 옵션 중 가장 편한 것을 사용하거나 빌드 시스템에 가장 적합한 것을 사용합니다.

옵션 1. priconfig.packaging.xml을 사용하여 앱 패키지에 리소스 빌드

  1. Visual Studio에서 새 항목을 프로젝트에 추가합니다. XML 파일을 선택하고, 파일 이름을 priconfig.packaging.xml로 지정합니다.
  2. 솔루션 탐색기에서 priconfig.packaging.xml을 선택하고, 속성 창을 확인합니다. 파일의 빌드 작업은 없음으로 설정하고, 출력 디렉터리에 복사는 복사 안 함으로 설정해야 합니다.
  3. 파일의 내용을 이 XML로 바꿉니다.
    <packaging>
       <autoResourcePackage qualifier="Language" />
       <autoResourcePackage qualifier="Scale" />
       <autoResourcePackage qualifier="DXFeatureLevel" />
    </packaging>
    
  4. <autoResourcePackage> 요소가 Visual Studio에게 주어진 한정자 이름에 대한 리소스를 별도의 리소스 패키지로 자동으로 분할하도록 지시합니다. 이를 자동 분할이라고 합니다. 지금까지의 파일 내용을 사용하면 Visual Studio의 동작이 실제로 변경되지 않습니다. 다시 말하면, 이러한 내용은 기본값이므로 Visual Studio는 이 파일에 해당 내용이 있는 것처럼 이미 동작하고 있습니다. Visual Studio가 한정자 이름에서 자동 분할되지 않도록 하려면 파일에서 해당 <autoResourcePackage> 요소를 삭제합니다. 별도 리소스 패키지로 자동 분할되지 않고 모든 언어 리소스가 앱 패키지에 빌드되길 원했다면 파일이 다음과 같을 것입니다.
    <packaging>
       <autoResourcePackage qualifier="Scale" />
       <autoResourcePackage qualifier="DXFeatureLevel" />
    </packaging>
    
  5. 파일을 저장하고 닫은 다음, 프로젝트를 다시 빌드합니다.

선택한 자동 분할 방법이 제대로 적용되고 있는지 확인하려면 <ProjectFolder>\obj\<ReleaseConfiguration folder>\split.priconfig.xml 파일을 찾아 내용이 선택 방법과 일치하는지 확인합니다. 일치하면 선택한 방법대로 리소스가 앱 패키지에 빌드되도록 Visual Studio를 구성한 것입니다.

이제 마지막 한 단계만 수행하면 됩니다. 단, Language 한정자 이름을 삭제한 경우에만 그렇습니다. 앱에서 지원되는 모든 언어의 합집합을 앱의 기본 언어로 지정해야 합니다. 자세한 내용은 앱에서 사용하는 기본 리소스 지정을 참조하세요. 이는 영어, 스페인어, 프랑스어에 대한 리소스를 앱 패키지에 포함하고 있었던 경우 priconfig.default.xml에 들어 있었을 내용입니다.

   <default>
      <qualifier name="Language" value="en;es;fr" />
      ...
   </default>

어떻게 작동하나요?

백그라운드에서 Visual Studio는 MakePri.exe라는 도구를 실행하여 패키지 리소스 인덱스라는 파일을 생성합니다. 이 파일에는 자동 분할의 기준이 되는 리소스 한정자 이름을 나타내는 등 모든 앱 리소스에 대한 설명이 들어 있습니다. 이 도구에 대한 자세한 내용은 MakePri.exe를 사용하여 수동으로 리소스 컴파일을 참조하세요. Visual Studio가 구성 파일을 MakePri.exe에 전달합니다. priconfig.packaging.xml 파일의 내용이 자동 분할을 결정하는 부분인 구성 파일의 <packaging> 요소로 사용됩니다. 따라서 priconfig.packaging.xml을 추가하고 편집하면 Visual Studio가 앱에 대해 생성하는 패키지 리소스 인덱스 파일의 내용뿐만 아니라 앱 번들에 있는 패키지의 내용에도 영향을 미칩니다.

priconfig.packaging.xml이 아닌 다른 파일 이름 사용

파일 이름을 priconfig.packaging.xml로 지정하면 Visual Studio에서 이를 인식하고 자동으로 사용합니다. 다른 이름을 지정하면 Visual Studio에 알려야 합니다. 프로젝트 파일에서 이 XML을 첫 번째 <PropertyGroup> 요소의 여는 태그와 닫는 태그 사이에 추가합니다.

<AppxPriConfigXmlPackagingSnippetPath>FILE-PATH-AND-NAME</AppxPriConfigXmlPackagingSnippetPath>

FILE-PATH-AND-NAME을 파일의 경로와 이름으로 바꿉니다.

옵션 2. 프로젝트 파일을 사용하여 앱 패키지에 리소스 빌드

이 옵션은 옵션 1의 대안입니다. 옵션 1의 작동 방식을 이해했고 개발 및/또는 빌드 워크플로에 더 적합한 경우 옵션 2를 대신 수행하도록 선택할 수 있습니다.

프로젝트 파일에서 이 XML을 첫 번째 <PropertyGroup> 요소의 여는 태그와 닫는 태그 사이에 추가합니다.

<AppxBundleAutoResourcePackageQualifiers>Language|Scale|DXFeatureLevel</AppxBundleAutoResourcePackageQualifiers>

첫 번째 한정자 이름을 삭제한 후의 모습은 다음과 같습니다.

<AppxBundleAutoResourcePackageQualifiers>Scale|DXFeatureLevel</AppxBundleAutoResourcePackageQualifiers>

저장하고 닫은 다음, 프로젝트를 다시 빌드합니다.

이제 마지막 한 단계만 수행하면 됩니다. 단, Language 한정자 이름을 삭제한 경우에만 그렇습니다. 앱에서 지원되는 모든 언어의 합집합을 앱의 기본 언어로 지정해야 합니다. 자세한 내용은 앱에서 사용하는 기본 리소스 지정을 참조하세요. 앱 패키지에 영어, 스페인어 및 프랑스어에 대한 리소스를 포함한 경우 프로젝트 파일에 포함될 내용입니다.

<AppxDefaultResourceQualifiers>Language=en;es;fr</AppxDefaultResourceQualifiers>