Этот ответ основан на принципах упаковки библиотеки .NET Framework и принципы упаковки библиотеки универсальной платформы Windows. Сначала прочитайте связанные ответы, чтобы лучше понять следующее.
Когда вы напрямую ссылаетесь на SDK расширения Visual Studio в проекте, в файл .csproj включается следующий фрагмент:
<SDKReference Include="Microsoft.PlayerFramework.Xaml.UWP, Version=3.0.0.2">
<Name>Microsoft Player Framework</Name>
</SDKReference>
NuGet предлагает функции, позволяющие выполнять эквивалентное действие при установке пакета NuGet. Первое, что вы должны сделать, это создать в своем проекте файл .targets (например, 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, чтобы избежать ненужного прикосновения к нему в процессе сборки.
Включив этот файл .targets в соответствующее место в структуре пакета NuGet, он будет автоматически объединен во время выполнения с проектами, использующими вашу библиотеку. Вы хотите получить следующую структуру пакета:
+---build
| \---uap10.0
| MyLibraryUsingExtensionSdk.targets
|
\---lib
\---uap10.0
| MyLibraryUsingExtensionSdk.dll
| MyLibraryUsingExtensionSdk.pdb
| MyLibraryUsingExtensionSdk.pri
| MyLibraryUsingExtensionSdk.XML
|
\---MyLibraryUsingExtensionSdk
ExampleControl.xaml
MyLibraryUsingExtensionSdk.xr.xml
Вы можете создать такой пакет, используя следующий шаблон .nuspec:
<?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>
Обратите внимание, что Visual Studio потребует перезагрузки решения, чтобы полностью распознать расширение SDK после установки такого пакета NuGet. Сборки будут работать сразу без проблем, но IntelliSense не подхватит новый SDK расширения до перезагрузки.
К сожалению, этот подход требует, чтобы вы жестко запрограммировали номер версии SDK расширения, что может быть проблематично. На момент написания я не знаю способа указать диапазон версий или независимую от версии ссылку.
Не забудьте создать решение с использованием конфигурации Release перед созданием пакета NuGet.
Образец библиотеки и соответствующие файлы упаковки доступны на GitHub. Решение, соответствующее этому ответу, — UwpLibraryDependingOnExtensionSdks.
person
Sander
schedule
05.01.2016