Создание пакетов UWP

Universal Windows Platform (UWP) предоставляет общую платформу приложений для каждого устройства, работающего Windows 10. В рамках этой модели приложения UWP могут вызывать интерфейсы API WinRT, которые являются общими для всех устройств, а также API (включая Win32 и .NET), относящиеся к семейству устройств, на которых работает приложение.

В этом пошаговом руководстве вы создадите пакет NuGet с собственным компонентом UWP (включая элемент управления XAML), который можно использовать как в управляемых, так и в собственных проектах.

Необходимые условия

  1. Visual Studio 2017 или Visual Studio 2015. Установите выпуск Community 2017 бесплатно из visualstudio.com; Вы также можете использовать выпуски Professional и Enterprise.

  2. Интерфейс командной строки NuGet. Скачайте последнюю версию nuget.exe с сайта nuget.org/downloads, сохранив её в выбранной вами папке (скачивается такой .exe непосредственно). Затем добавьте это расположение в переменную среды PATH, если это еще не так.

Создание компонента Windows Runtime UWP

  1. В Visual Studio выберите File > New > Project, разверните узел Visual C++ > Windows > Universal, выберите шаблон Windows Runtime Component (Универсальная платформа Windows), измените имя на ImageEnhancer и нажмите кнопку "ОК". При появлении запроса примите значения по умолчанию для целевой версии и минимальной версии.

    Создание нового проекта компонента Windows Runtime UWP

  2. Щелкните проект правой кнопкой мыши в Solution Explorer, выберите Add > New Item, Щелкните узел Visual C++ > XAML, выберите Templated Control измените имя на AwesomeImageControl.cpp и щелкните Add:

    Добавление нового элемента элемента управления с шаблоном XAML в проект

  3. Щелкните проект правой кнопкой мыши в Solution Explorer и выберите Properties. На странице свойств разверните Configuration Properties > C/C++ и щелкните Output Files. В области справа измените значение для параметра Создание XML-документации на да.

    Установка параметра

  4. Щелкните решение правой кнопкой мыши, выберите пакетную сборку, установите три поля отладки в диалоговом окне, как показано ниже. Это гарантирует, что при выполнении сборки создается полный набор артефактов для каждой из целевых систем, которые поддерживаются Windows.

    Пакетная сборка

  5. В диалоговом окне пакетной сборки нажмите кнопку "Сборка ", чтобы проверить проект и создать выходные файлы, необходимые для пакета NuGet.

Замечание

В этом пошаговом руководстве вы используете отладочные артефакты для пакета. Для не отладочного пакета проверьте параметры релиза в диалоговом окне "Пакетная сборка" и обратитесь к результирующим папкам релиза в последующих шагах.

Создание и обновление 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 требует метаданных, описывающих все его общедоступные типы, что позволяет другим приложениям и библиотекам использовать компонент. Эти метаданные содержатся в winmd-файле, который создается при компиляции проекта и должен быть включен в пакет NuGet. XML-файл с данными IntelliSense также создается одновременно и должен быть включен.

Добавьте следующий <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 находится в нативном коде, который содержится в различных ImageEnhancer.dll сборках, создаваемых для каждой целевой среды выполнения (ARM, x86 и x64). Чтобы включить их в пакет, ознакомьтесь с ними в <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>

Добавление целевых объектов

Затем проектам C++ и JavaScript, которые могут использовать ваш пакет NuGet, нужен файл .targets для идентификации необходимых сборок и winmd-файлов. (Проекты C# и Visual Basic делают это автоматически.) Создайте этот файл, скопировав приведенный ниже текст в ImageEnhancer.targets, и сохраните его в той же папке, что и файл .nuspec. Примечание. Этот .targets файл должен быть таким же именем, как и идентификатор пакета (например <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 , и разверните все узлы, вы увидите следующее содержимое:

Обозреватель пакетов NuGet с пакетом ImageEnhancer

Подсказка

Файл .nupkg — это только ZIP-файл с другим расширением. Вы также можете проверить содержимое пакета, изменив .nupkg на .zip, но не забудьте восстановить расширение перед отправкой пакета в nuget.org.

Чтобы сделать пакет доступным для других разработчиков, следуйте инструкциям по публикации пакета.