Создание пакетов универсальной платформы Windows
Универсальная платформа Windows (UWP) предоставляет единую платформу приложений для всех устройств с операционной системой Windows 10. В этой модели приложения UWP могут вызывать как интерфейсы API WinRT, общие для всех устройств, так и интерфейсы API (включая Win32 и .NET), относящиеся только к семейству устройств, на которых работает приложение.
В этом пошаговом руководстве вы создадите пакет NuGet с собственным компонентом UWP (включая элемент управления XAML), который можно использовать как в управляемых, так и в собственных проектах.
Visual Studio 2017 или Visual Studio 2015. Установите бесплатный выпуск Community 2017 с сайта visualstudio.com. Вы также можете использовать выпуски Professional и Enterprise.
Интерфейс командной строки NuGet. Скачайте последнюю версию
nuget.exe
на странице nuget.org/downloads, сохранив ее в любом месте на ваш выбор (скачивается сразу файл.exe
). Затем добавьте это расположение в переменную среды PATH, если это еще не сделано.
В Visual Studio выберите "Создать > файл > Project", разверните универсальный узел Visual C Windows>++>, выберите шаблон компонента среда выполнения Windows (универсальная Windows), измените имя на ImageEnhancer и нажмите кнопку "ОК". При появлении запроса оставьте значения свойств "Конечная версия" и "Минимальная версия" по умолчанию.
Щелкните проект правой кнопкой мыши в Обозреватель решений, выберите "Добавить > новый элемент", щелкните узел XAML Visual C++>, выберите "Шаблонный элемент управления", измените имя на AwesomeImageControl.cpp и нажмите кнопку "Добавить".
Щелкните проект правой кнопкой мыши в Обозреватель решений и выберите пункт "Свойства". На странице "Свойства" разверните узел "Свойства > конфигурации" C/C++ и щелкните "Выходные файлы". В области справа измените значение свойства Создавать файлы XML-документации на "Да".
Теперь щелкните решение правой кнопкой мыши, выберите пункт Пакетная сборка и в открывшемся диалоговом окне установите три флажка в строках, соответствующих конфигурации отладки, как показано ниже. Благодаря этому при сборке создается полный набор артефактов для каждой из целевых систем, поддерживаемых Windows.
В диалоговом окне "Пакетная сборка" щелкните Сборка, чтобы проверить проект и создать выходные файлы, которые потребуются для пакета NuGet.
Примечание
В этом пошаговом руководстве для пакета будут использоваться артефакты отладки. Если пакет не является отладочным, в диалоговом окне "Пакетная сборка" установите вместо этого флажки в строках, соответствующих конфигурации выпуска, и при выполнении последующих действий обращайтесь к полученным папкам выпуска.
Чтобы создать исходный файл .nuspec
, выполните три указанных ниже действия. В следующих разделах приводятся указания по другим необходимым изменениям.
Откройте командную строку и перейдите к папке, содержащей файл
ImageEnhancer.vcxproj
(это вложенная папка в папке с файлом решения).Выполните команду NuGet
spec
, чтобы создать файлImageEnhancer.nuspec
(его имя будет соответствовать имени файла.vcxproj
):nuget spec
Откройте файл
ImageEnhancer.nuspec
в редакторе и измените его содержимое так, как показано ниже, заменив YOUR_NAME на соответствующее значение. Значение<id>
должно быть уникальным в пределах nuget.org (см. соглашения об именовании, описанные в разделе Создание пакета). Кроме того, обратите внимание на то, что необходимо изменить теги author и description, иначе на этапе упаковки произойдет ошибка.<?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 требуются метаданные, которые описывают все его общедоступные типы, что делает возможным использование компонента другими приложениями и библиотеками. Эти метаданные содержатся в файле 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-файл с шаблоном по умолчанию для элемента управления (который создается шаблоном проекта). Он также указывается в разделе <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). Чтобы включить их в пакет, добавьте ссылки на них и на связанные с ними PRI-файлы ресурсов в раздел <files>
:
<?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
должен выглядеть следующим образом (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, и развернуть все узлы, отобразится следующее содержимое:
Совет
Файл .nupkg
— это просто ZIP-файл с другим расширением. Поэтому чтобы просмотреть содержимое пакета, можно просто изменить расширение .nupkg
на .zip
, но не забудьте восстановить расширение перед отправкой пакета на сайт nuget.org.
Чтобы сделать пакет доступным для других разработчиков, следуйте инструкциям по публикации пакета.