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


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

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

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

1 7

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:

<?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 расширения, что может быть проблематично. На момент написания статьи я не знаю способа указать диапазон версий или независимую от версии ссылку.

Не забудьте построить решение с использованием конфигурации выпуска перед созданием пакета NuGet.

Образец библиотека и соответствующие файлы упаковки доступны на GitHub. Решением, соответствующим этому ответу, является UwpLibraryDependingOnExtensionSdks.