다음을 통해 공유


UWP 패키지 만들기

UWP(유니버설 Windows 플랫폼)은 Windows 10을 실행하는 모든 디바이스에 공통된 응용 프로그램 플랫폼을 제공합니다. 이 모델 내에서 UWP 응용 프로그램은 모든 디바이스에 공통적인 WinRT API 및 응용 프로그램이 실행되는 디바이스 제품군에만 적용되는 API(Win32 및 .NET 포함)를 모두 호출할 수 있습니다.

이 연습에서는 관리 및 네이티브 프로젝트에서 모두 사용할 수 있는 네이티브 UWP 구성 요소(XAML 컨트롤 포함)를 사용하여 NuGet 패키지를 만듭니다.

필수 조건

  1. Visual Studio 2017 또는 Visual Studio 2015 - visualstudio.com에서 추가 비용 없이 2017 Community 버전을 설치합니다. Professional 및 Enterprise 버전도 사용할 수 있습니다.

  2. NuGet CLI - nuget.org/downloads에서 최신 버전의 nuget.exe를 다운로드하여 선택한 위치에 저장합니다(다운로드는 바로 .exe임). 그런 다음 해당 위치를 PATH 환경 변수에 추가합니다(아직 없는 경우).

UWP Windows 런타임 구성 요소 만들기

  1. Visual Studio 새 > 파일 > Project 선택하고, Visual C++ > Windows > 유니버설 노드를 확장하고, Windows 런타임 구성 요소(유니버설 Windows) 템플릿을 선택하고, 이름을 ImageEnhancer로 변경하고, 확인을 클릭합니다. 메시지가 표시되면 대상 버전 및 최소 버전에 대한 기본값을 적용합니다.

    Creating a new UWP Windows Runtime Component project

  2. 솔루션 탐색기 프로젝트를 마우스 오른쪽 단추로 클릭하고, 새 항목 추가>를 선택하고, Visual C++ > XAML 노드를 클릭하고, 템플릿 컨트롤을 선택하고, 이름을 AwesomeImageControl.cpp로 변경하고, 추가를 클릭합니다.

    Adding a new XAML Templated Control item to the project

  3. 솔루션 탐색기 프로젝트를 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다. 속성 페이지에서 구성 속성 > C/C++를 확장하고 출력 파일을 클릭합니다. 오른쪽 창에서 XML 문서 파일 생성의 값을 Yes로 변경합니다.

    Setting Generate XML Documentation Files to Yes

  4. 이제 솔루션을 마우스 오른쪽 단추로 클릭하고, 일괄 빌드를 선택하고, 아래 그림과 같이 대화 상자에서 세 개의 [디버그] 확인란을 선택합니다. 이렇게 하면 빌드를 수행할 때 Windows에서 지원하는 각 대상 시스템에 대한 전체 아티팩트 집합이 생성됩니다.

    Batch Build

  5. [일괄 빌드] 대화 상자에서 빌드를 클릭하여 프로젝트를 확인하고, NuGet 패키지에 필요한 출력 파일을 만듭니다.

참고

이 연습에서는 패키지에 대한 [디버그] 아티팩트를 사용합니다. 디버그가 아닌 패키지의 경우 [일괄 빌드] 대화 상자에서 [릴리스] 옵션을 대신 선택하고 다음 단계에서 나오는 결과 [Release] 폴더를 참조하세요.

.nuspec 파일 만들기 및 업데이트

초기 .nuspec 파일을 만들려면 아래의 세 단계를 수행합니다. 다음에 나오는 섹션에서 필요한 다른 업데이트를 안내합니다.

  1. 명령 프롬프트를 열고 ImageEnhancer.vcxproj가 포함된 폴더(솔루션 파일이 있는 폴더의 하위 폴더)로 이동합니다.

  2. NuGet spec 명령을 실행하여 ImageEnhancer.nuspec(.vcxproj 파일의 이름에서 가져온 파일 이름)을 생성합니다.

    nuget spec
    
  3. 편집기에서 ImageEnhancer.nuspec을 열고 YOUR_NAME을 적절한 값으로 바꿔 다음과 일치하도록 업데이트합니다. 특히 <id> 값은 nuget.org 전체에서 고유해야 합니다(패키지 만들기에서 설명한 명명 규칙 참조). 또한 작성자 및 설명 태그도 업데이트해야 합니다. 그렇지 않으면 압축 단계에서 오류가 발생합니다.

    <?xml version="1.0"?>
    <package >
        <metadata>
        <id>ImageEnhancer.YOUR_NAME</id>
        <version>1.0.0</version>
        <title>ImageEnhancer</title>
        <authors>YOUR_NAME</authors>
        <owners>YOUR_NAME</owners>
        <requireLicenseAcceptance>false</requireLicenseAcceptance>
        <description>Awesome Image Enhancer</description>
        <releaseNotes>First release</releaseNotes>
        <copyright>Copyright 2016</copyright>
        <tags>image enhancer imageenhancer</tags>
        </metadata>
    </package>
    

참고

공용으로 빌드된 패키지의 경우 <tags> 요소에 특히 주의하세요. 이러한 태그는 다른 사람들이 패키지를 찾고 그 기능을 이해하는 데 도움이 됩니다.

패키지에 Windows 메타데이터 추가

Windows 런타임 구성 요소에는 공개적으로 사용할 수 있는 모든 형식을 설명하는 메타데이터가 필요하며, 이를 통해 다른 앱과 라이브러리에서 해당 구성 요소를 사용할 수 있습니다. 이 메타데이터는 프로젝트를 컴파일할 때 만들어지며 NuGet 패키지에 포함되어야 하는 .winmd 파일에 포함되어 있습니다. 또한 IntelliSense 데이터가 있는 XML 파일도 동시에 빌드되므로 포함되어야 합니다.

다음 <files> 노드를 .nuspec 파일에 추가합니다.

<package>
    <metadata>
        ...
    </metadata>

    <files>
        <!-- WinMd and IntelliSense files -->
        <file src="..\Debug\ImageEnhancer\ImageEnhancer.winmd" target="lib\uap10.0"/>
        <file src="..\Debug\ImageEnhancer\ImageEnhancer.xml" target="lib\uap10.0"/>
    </files>
</package>

XAML 콘텐츠 추가

구성 요소에 XAML 컨트롤을 포함하려면 프로젝트 템플릿으로 생성되는 컨트롤에 대한 기본 템플릿이 있는 XAML 파일을 추가해야 합니다. 이는 <files> 섹션에도 포함됩니다.

<?xml version="1.0"?>
<package >
    <metadata>
        ...
    </metadata>
    <files>
        ...

        <!-- XAML controls -->
        <file src="Themes\Generic.xaml" target="lib\uap10.0\Themes"/>

    </files>
</package>

네이티브 구현 라이브러리 추가

구성 요소 내에서 ImageEnhancer 형식의 핵심 논리는 각 대상 런타임(ARM, x86 및 x64)에 대해 생성되는 다양한 ImageEnhancer.dll 어셈블리에 포함된 네이티브 코드에 있습니다. 패키지에 이러한 어셈블리를 포함하려면 다음과 같이 <files> 섹션에서 관련된 .pri 리소스 파일과 함께 이를 참조합니다.

<?xml version="1.0"?>
<package >
    <metadata>
        ...
    </metadata>
    <files>
        ...

        <!-- DLLs and resources -->
        <file src="..\ARM\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-arm\native"/>
        <file src="..\ARM\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-arm\native"/>

        <file src="..\ARM64\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-arm64\native"/>
        <file src="..\ARM64\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-arm64\native"/>

        <file src="..\x64\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-x64\native"/>
        <file src="..\x64\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-x64\native"/>

        <file src="..\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-x86\native"/>
        <file src="..\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-x86\native"/>

    </files>
</package>

.targets 추가

다음으로 NuGet 패키지를 사용할 수 있는 C++ 및 JavaScript 프로젝트에는 필요한 어셈블리 및 winmd 파일을 식별하는 .targets 파일이 필요합니다. (C# 및 Visual Basic 프로젝트는 이 작업을 자동으로 수행합니다.) 아래 ImageEnhancer.targets 텍스트를 복사하여 이 파일을 만들고 파일과 동일한 폴더에 .nuspec 저장합니다. 참고:이 .targets 파일은 패키지 ID와 같은 이름이어야 합니다(예: .nupspec 파일의 <Id> 요소).

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <ImageEnhancer-Platform Condition="'$(Platform)' == 'Win32'">x86</ImageEnhancer-Platform>
        <ImageEnhancer-Platform Condition="'$(Platform)' != 'Win32'">$(Platform)</ImageEnhancer-Platform>
    </PropertyGroup>
    <ItemGroup Condition="'$(TargetPlatformIdentifier)' == 'UAP'">
        <Reference Include="$(MSBuildThisFileDirectory)..\..\lib\uap10.0\ImageEnhancer.winmd">
            <Implementation>ImageEnhancer.dll</Implementation>
        </Reference>
    <ReferenceCopyLocalPaths Include="$(MSBuildThisFileDirectory)..\..\runtimes\win10-$(ImageEnhancer-Platform)\native\ImageEnhancer.dll" />
    </ItemGroup>
</Project>

그런 다음 .nuspec 파일에서 ImageEnhancer.targets를 참조합니다.

<?xml version="1.0"?>
<package >
    <metadata>
        ...
    </metadata>
    <files>
        ...

        <!-- .targets -->
        <file src="ImageEnhancer.targets" target="build\native"/>

    </files>
</package>

최종 .nuspec

최종 .nuspec 파일은 이제 다음과 같으며, YOUR_NAME을 적절한 값으로 바꾸어야 합니다.

<?xml version="1.0"?>
<package >
    <metadata>
    <id>ImageEnhancer.YOUR_NAME</id>
    <version>1.0.0</version>
    <title>ImageEnhancer</title>
    <authors>YOUR_NAME</authors>
    <owners>YOUR_NAME</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Awesome Image Enhancer</description>
    <releaseNotes>First Release</releaseNotes>
    <copyright>Copyright 2016</copyright>
    <tags>image enhancer imageenhancer</tags>
    </metadata>
    <files>
    <!-- WinMd and IntelliSense -->
    <file src="..\Debug\ImageEnhancer\ImageEnhancer.winmd" target="lib\uap10.0"/>
    <file src="..\Debug\ImageEnhancer\ImageEnhancer.xml" target="lib\uap10.0"/>

    <!-- XAML controls -->
    <file src="Themes\Generic.xaml" target="lib\uap10.0\Themes"/>

    <!-- DLLs and resources -->
    <file src="..\ARM\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-arm\native"/>
    <file src="..\ARM\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-arm\native"/>
    <file src="..\ARM64\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-arm64\native"/>
    <file src="..\ARM64\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-arm64\native"/>     
    <file src="..\x64\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-x64\native"/>
    <file src="..\x64\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-x64\native"/>
    <file src="..\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-x86\native"/>
    <file src="..\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-x86\native"/>

    <!-- .targets -->
    <file src="ImageEnhancer.targets" target="build\native"/>

    </files>
</package>

구성 요소 패키징

완료된 .nuspec에서 패키지에 포함되어야 하는 모든 파일을 참조하면 pack 명령을 실행할 준비가 되었습니다.

nuget pack ImageEnhancer.nuspec

이 명령은 ImageEnhancer.YOUR_NAME.1.0.0.nupkg를 생성합니다. NuGet 패키지 탐색기와 같은 도구에서 이 파일을 열고 모든 노드를 확장하면 다음과 같은 내용이 표시됩니다.

NuGet Package Explorer showing the ImageEnhancer package

.nupkg 파일은 확장명이 다른 ZIP 파일일 뿐입니다. .nupkg.zip으로 변경하여 패키지 내용을 검사할 수도 있지만 패키지를 nuget.org에 업로드하려면 먼저 확장명을 복원해야 합니다.

패키지를 다른 개발자가 사용할 수 있도록 하려면 패키지 게시에 대한 지침을 따르세요.