【问题标题】:How to package a .NET library that targets the Universal Windows Platform and depends on Visual Studio extension SDKs?如何打包面向通用 Windows 平台并依赖于 Visual Studio 扩展 SDK 的 .NET 库?
【发布时间】:2016-04-09 07:08:04
【问题描述】:

如何打包依赖于 Visual Studio 扩展 SDK(例如 Microsoft Player Framework)的通用 Windows 平台库?

具体来说,我希望我的库的用户能够在按下 NuGet 中的“安装”按钮后立即使用它,而无需手动将扩展 SDK 添加到他们的项目中。当然,假设实际安装了适当的扩展 SDK。

这是一系列问题和答案,记录了我对现代 NuGet 包创作主题的发现,特别关注 NuGet 3 引入的更改。您可能还对一些相关问题感兴趣:

【问题讨论】:

标签: nuget uwp nuget-package visual-studio-extensions


【解决方案1】:

此答案基于principles of .NET Framework library packagingprinciples of Universal Windows Platform library packaging。首先阅读链接的答案以更好地理解以下内容。

当您在项目中直接引用 Visual Studio 扩展 SDK 时,.csproj 文件中包含以下 sn-p:

<SDKReference Include="Microsoft.PlayerFramework.Xaml.UWP, Version=3.0.0.2">
  <Name>Microsoft Player Framework</Name>
</SDKReference>

NuGet 提供的功能可以在安装 NuGet 包时执行等效操作。您必须做的第一件事是在您的项目中创建一个 .targets 文件(例如 MyLibraryUsingExtensionSdk.targets),其中包含要添加到安装您的库的项目中的相关 XML。您需要从库的 .csproj 文件中复制相关的 &lt;SDKReference&gt; 元素并包含所有父元素,从而创建一个可以合并的完整 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>

将此文件的构建操作设置为无,以避免它被构建过程不必要地触及。

通过将此 .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>

请注意,安装此类 NuGet 包后,Visual Studio 将需要重新加载解决方案才能完全识别扩展 SDK。构建将立即运行而不会出现问题,但 IntelliSense 在重新加载之前不会选择新的扩展 SDK。

不幸的是,这种方法确实需要您对扩展 SDK 的版本号进行硬编码,这可能会产生问题。在撰写本文时,我不知道如何指定版本范围或与版本无关的参考。

请记住在创建 NuGet 包之前使用发布配置构建您的解决方案。

一个示例库和相关的打包文件是available on GitHub。这个答案对应的解决方案是UwpLibraryDependingOnExtensionSdks。

【讨论】:

    猜你喜欢
    • 2016-04-09
    • 2016-04-09
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 2017-12-16
    相关资源
    最近更新 更多