如何打包一个针对通用 Windows 平台并依赖于 Visual Studio 扩展 SDK 的 .NET 库?

10
我该如何打包一个依赖于Visual Studio扩展SDK(例如Microsoft Player Framework)的通用Windows平台库?
具体来说,我希望我的库的用户能够在NuGet中按下安装按钮后立即使用它,而无需手动将扩展SDK添加到他们的项目中。当然,前提是适当的扩展SDK已经被安装。
这是一系列关于现代NuGet包作者的问题和答案,特别关注了NuGet 3引入的变化。您可能还对以下相关问题感兴趣:

附注:您的问题/答案对已被注意并引起了这个元问题 - rene
1个回答

7
这篇回答基于.NET Framework库打包的原则通用Windows平台库打包的原则。请先阅读相关链接,以更好地理解以下内容。
当您在项目中直接引用Visual Studio扩展SDK时,以下代码片段将被包含在.csproj文件中:
<SDKReference Include="Microsoft.PlayerFramework.Xaml.UWP, Version=3.0.0.2">
  <Name>Microsoft Player Framework</Name>
</SDKReference>

NuGet提供的功能可以在安装NuGet包时执行等效操作。您需要做的第一件事是在项目中创建一个.targets文件(例如MyLibraryUsingExtensionSdk.targets),其中包含要添加到安装了您的库的项目中的相关XML。您将想要从库的.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>

将此文件的构建操作设置为“无”,以避免构建过程不必要地触及它。
通过在NuGet包结构的适当位置包含此.targets文件,它将在运行时自动合并到使用您库的项目中。您希望实现以下软件包结构:
+---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包之前,请使用Release配置构建解决方案。 GitHub上提供了一个示例库和相关的打包文件。与此答案对应的解决方案是UwpLibraryDependingOnExtensionSdks。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接