Как упаковать библиотеку .NET, предназначенную для универсальной платформы Windows и зависящую от SDK расширений Visual Studio?

Как упаковать библиотеку универсальной платформы Windows, которая зависит от SDK расширений Visual Studio, таких как Microsoft Player Framework?

В частности, я хочу, чтобы пользователи моей библиотеки могли использовать ее сразу после нажатия кнопки «Установить» в NuGet без необходимости вручную добавлять пакеты SDK расширений в свои проекты. Предполагая, конечно, что соответствующие расширения SDK действительно установлены.

Это серия вопросов и ответов, которые документируют мои выводы по теме современной разработки пакетов NuGet, уделяя особое внимание изменениям, внесенным в NuGet 3. Вас также могут заинтересовать некоторые связанные вопросы:


person Sander    schedule 05.01.2016    source источник
comment
примечание: ваши пары вопрос/ответ были отмечены и вызвали этот мета-вопрос< /а>   -  person rene    schedule 06.01.2016


Ответы (1)


Этот ответ основан на принципах упаковки библиотеки .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