Как упаковать a.NET библиотека, предназначенная для универсальной платформы Windows и зависящая от пакетов SDK расширения Visual Studio?
Как упаковать универсальную библиотеку платформы Windows, которая зависит от пакетов SDK расширения Visual Studio, таких как Microsoft Player Framework?
В частности, я хочу, чтобы пользователи моей библиотеки могли использовать ее сразу после нажатия кнопки Install в NuGet, без необходимости вручную добавлять SDK расширения в свои проекты. При условии, конечно, что соответствующие расширения SDK действительно установлены.
Это серия вопросов и ответов. в этом документе я изложил свои выводы по теме разработки современных пакетов NuGet, уделив особое внимание изменениям, внесенным в NuGet 3. Вас также могут заинтересовать некоторые сопутствующие вопросы:
- Как упаковать библиотеку .NET Framework?
- Как упаковать библиотеку .NET, ориентированную на универсальную платформу Windows?
- Как упаковать портативную библиотеку .NET, ориентированную на .NET Core?
- Как упаковать библиотеку .NET таргетинг на .NET Framework и универсальную платформу Windows и включение специфичных для платформы функций?
- Как упаковать многоархитектурную библиотеку .NET, предназначенную для универсальной платформы Windows?
1 ответ:
Этот ответ опирается на принципы .Библиотека упаковывать и принципы универсальной платформы Windows библиотеки упаковка. Сначала прочитайте связанные ответы, чтобы лучше понять следующее.
Когда вы непосредственно ссылаетесь на пакет SDK расширения Visual Studio в проекте, в него включается следующий фрагмент кода .файл csproj:
<SDKReference Include="Microsoft.PlayerFramework.Xaml.UWP, Version=3.0.0.2"> <Name>Microsoft Player Framework</Name> </SDKReference>
NuGet предлагает функциональность, которая позволяет выполнить эквивалентное действие при установке NuGet пакет. Первое, что вы должны сделать, это создать в своем проекте а .целевой файл (например, MyLibraryUsingExtensionSdk.targets), содержащий соответствующий XML-файл, который будет добавлен в проект, в который установлена ваша библиотека. Вы захотите скопировать соответствующий элемент
<SDKReference>
из вашей библиотеки .csproj файл, а также включать любые родительские элементы, создавая полный XML-документ, который может быть объединен.<?xml version="1.0" encoding="utf-8"?> <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> <SDKReference Include="Microsoft.PlayerFramework.Xaml.UWP, Version=3.0.0.2"> <Name>Microsoft Player Framework</Name> </SDKReference> </ItemGroup> </Project>
Установите действие сборки этого файла равным None, чтобы избежать ненужного прикосновения к нему пользователя. процесс построения.
Включив это .целевой файл, расположенный в соответствующем месте структуры пакета NuGet, будет автоматически объединен во время выполнения в проекты, использующие вашу библиотеку. Вы хотите достичь следующей структуры пакета:
+---build | \---uap10.0 | MyLibraryUsingExtensionSdk.targets | \---lib \---uap10.0 | MyLibraryUsingExtensionSdk.dll | MyLibraryUsingExtensionSdk.pdb | MyLibraryUsingExtensionSdk.pri | MyLibraryUsingExtensionSdk.XML | \---MyLibraryUsingExtensionSdk ExampleControl.xaml MyLibraryUsingExtensionSdk.xr.xml
Вы можете создать такой пакет, используя следующее .шаблон nuspec:
Обратите внимание, что Visual Studio потребует перезагрузки решения, чтобы полностью распознать SDK расширения после установки такого пакета NuGet. Сборки будут работать сразу же без проблем, но IntelliSense не получит новый SDK расширения до перезагрузки. К сожалению, этот подход требует жесткого кода номера версии SDK расширения, что может быть проблематично. На момент написания статьи я не знаю способа указать диапазон версий или независимую от версии ссылку.<?xml version="1.0"?> <package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd"> <metadata minClientVersion="3.2"> <id>Example.MyLibraryUsingExtensionSdk</id> <version>1.0.0</version> <authors>Firstname Lastname</authors> <description>Example of a simple UWP library that depends on an extension SDK.</description> </metadata> <files> <!-- Causes referencing this NuGet package to also automatically reference the relevant extension SDKs. --> <file src="MyLibraryUsingExtensionSdk.targets" target="build\uap10.0\MyLibraryUsingExtensionSdk.targets" /> <file src="..\bin\Release\MyLibraryUsingExtensionSdk**" target="lib\uap10.0" /> </files> </package>
Не забудьте построить решение с использованием конфигурации выпуска перед созданием пакета NuGet.
Образец библиотека и соответствующие файлы упаковки доступны на GitHub. Решением, соответствующим этому ответу, является UwpLibraryDependingOnExtensionSdks.