UWP 패키지 만들기

Universal Windows Platform (UWP) Windows 10 실행하는 모든 디바이스에 대한 공통 앱 플랫폼을 제공합니다. 이 모델 내에서 UWP 앱은 모든 디바이스에 공통적인 WinRT API와 앱이 실행 중인 디바이스 패밀리와 관련된 API(Win32 및 .NET 포함)를 모두 호출할 수 있습니다.

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

사전 요구 사항

  1. Visual Studio 2017 또는 Visual Studio 2015. visualstudio.com 2017 Community Edition을 무료로 설치합니다. Professional 및 Enterprise 버전도 사용할 수 있습니다.

  2. NuGet CLI. nuget.org/downloads에서 의 최신 버전을 다운로드하여 원하는 위치에 저장합니다(다운로드는 입니다). 그런 다음, 해당 위치가 아직 없는 경우 PATH 환경 변수에 추가합니다.

UWP Windows Runtime 구성 요소 만들기

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

     새 UWP Windows Runtime 구성 요소 프로젝트 만들기

  2. Solution Explorer 프로젝트를 마우스 오른쪽 단추로 클릭하고 > 새 항목 추가를 선택합니다. 비전 C++ > XAML 노드를 클릭하고, Templated Control을 선택하고, 이름을 AwesomeImageControl.cpp 변경하고, Add 클릭합니다.

    프로젝트에 새 XAML 템플릿 컨트롤 항목 추가

  3. Solution Explorer 프로젝트를 마우스 오른쪽 단추로 클릭하고 Properties. 속성 페이지에서 구성 속성 > C/C++ 확장하고 Output 파일을 클릭합니다. 오른쪽 창에서 XML 문서 파일 생성 설정 값을 '네'로 변경합니다.

    XML 문서 파일 생성을 예로 설정

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

    배치 빌드

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

메모

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

.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 Runtime 구성 요소에는 공개적으로 사용할 수 있는 모든 형식을 설명하는 메타데이터가 필요하므로 다른 앱 및 라이브러리에서 구성 요소를 사용할 수 있습니다. 이 메타데이터는 프로젝트를 컴파일할 때 생성되며 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(예: 파일의 <Id> 요소 .nupspec )와 이름이 같아야 합니다.

<?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>

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

<?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 패키지 탐색기와 같은 도구에서 이 파일을 열고 모든 노드를 확장하면 다음 내용이 표시됩니다.

ImageEnhancer 패키지를 보여 주는 NuGet 패키지 탐색기

팁 (조언)

.nupkg 파일은 다른 확장자를 가진 ZIP 파일일 뿐입니다. 패키지 콘텐츠를 검사한 다음에는 .nupkg에서 .zip로 변경하여 검사할 수 있지만, nuget.org에 패키지를 업로드하기 전에 반드시 확장을 복원해야 합니다.

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