如何打包面向 .NET Framework 和通用 Windows 平台的 .NET 库并包含特定于平台的功能?
How to package a .NET library targeting .NET Framework and Universal Windows Platform and include platform-specific functionality?
如何以现代通用方式打包具有以下属性的 .NET 库?
- 为 .NET Framework 4.6 和通用 Windows 平台提供一些共享功能。
- 为每个平台提供一些特定于平台的功能(例如专门的 类 或 APIs,包括 XAML UWP 的用户控件),具有对外部库的潜在平台特定依赖性。
- 与体系结构无关 (AnyCPU)。
- 它的可移植子集可供其他以兼容 API 表面为目标的可移植库使用。
This is a series of questions and answers that document my findings on the topic of modern NuGet package authoring, focusing especially on the changes introduced with NuGet 3. You may also be interested in some related questions:
这个答案建立在 , the and the 的基础上。请先阅读链接的答案以更好地理解以下内容。
为了服务于所描述的平台集,您需要将您的解决方案相应地构建到多个 class 库项目中:
- .NET Framework 4.6 的 platform-specific class 库。
- 通用 Windows 平台的 platform-specific class 库。
- 针对常见 API 表面的便携式库。
您需要实现以下 NuGet 包结构:
\---lib
+---dotnet
| MyPortableLibrary.dll
| MyPortableLibrary.pdb
| MyPortableLibrary.XML
|
+---net46
| MyDotNetLibrary.dll
| MyDotNetLibrary.pdb
| MyDotNetLibrary.XML
| MyPortableLibrary.dll
| MyPortableLibrary.pdb
| MyPortableLibrary.XML
|
\---uap10.0
| MyPortableLibrary.dll
| MyPortableLibrary.pdb
| MyPortableLibrary.XML
| MyUwpLibrary.dll
| MyUwpLibrary.pdb
| MyUwpLibrary.pri
| MyUwpLibrary.XML
|
\---MyUwpLibrary
HashControl.xaml
MyUwpLibrary.xr.xml
如果您已经熟悉上面链接的其他答案,那么您应该比较熟悉。唯一特别的地方是便携库一共有三个副本,因为它的内容是为所有目标平台提供的。
可以使用基于以下模板的 nuspec 文件来实现所需的包结构:
<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata minClientVersion="3.2">
<id>Example.MyMultiSurfaceLibrary</id>
<version>1.0.0</version>
<authors>Firstname Lastname</authors>
<description>Example of a multi-platform library that exposes different API surfaces to .NET 4.6 and UWP and also includes a portable component.</description>
<dependencies>
<!-- UWP has more dependencies than other platforms (Newtonsoft.Json). -->
<group targetFramework="uap10.0">
<dependency id="Newtonsoft.Json" version="8.0.1" />
<dependency id="System.Linq" version="4.0.0" />
<dependency id="System.Numerics.Vectors" version="4.1.0" />
<dependency id="System.Resources.ResourceManager" version="4.0.0" />
<dependency id="System.Runtime" version="4.0.20" />
</group>
<!-- All other platforms - just the dependencies of the portable library here. -->
<group>
<dependency id="System.Linq" version="4.0.0" />
<dependency id="System.Numerics.Vectors" version="4.1.0" />
<dependency id="System.Resources.ResourceManager" version="4.0.0" />
<dependency id="System.Runtime" version="4.0.20" />
</group>
</dependencies>
</metadata>
<files>
<file src="..\bin\Release\MyPortableLibrary.*" target="lib\net46" />
<file src="..\bin\Release\MyPortableLibrary.*" target="lib\uap10.0" />
<file src="..\bin\Release\MyPortableLibrary.*" target="lib\dotnet" />
<file src="..\..\MyDotNetLibrary\bin\Release\MyDotNetLibrary.*" target="lib\net46" />
<!-- Double wildcard also ensures that the subdirectory is packaged. -->
<file src="..\..\MyUwpLibrary\bin\Release\MyUwpLibrary**" target="lib\uap10.0" />
</files>
</package>
请注意,定义了两组独立的依赖项:一组 general-purpose 组和一组特定于通用 Windows 平台,因为 UWP 库对 Newtonsoft.Json 包有额外的依赖性.您可以将相同的模式扩展到具有 platform-specific 依赖关系的任意数量的平台。
就是这样 - 这个 NuGet 包现在可以安装到 .NET Framework 4.6 项目、通用 Windows 平台项目和面向兼容 API 界面的可移植库项目中。可移植库的功能将在所有平台上导出,platform-specific 库也在适当的平台上使用。
记得在创建 NuGet 包之前使用 Release 配置构建您的解决方案。
示例库和相关打包文件为available on GitHub。这个答案对应的解决方案是MultiSurfaceLibrary.
如何以现代通用方式打包具有以下属性的 .NET 库?
- 为 .NET Framework 4.6 和通用 Windows 平台提供一些共享功能。
- 为每个平台提供一些特定于平台的功能(例如专门的 类 或 APIs,包括 XAML UWP 的用户控件),具有对外部库的潜在平台特定依赖性。
- 与体系结构无关 (AnyCPU)。
- 它的可移植子集可供其他以兼容 API 表面为目标的可移植库使用。
This is a series of questions and answers that document my findings on the topic of modern NuGet package authoring, focusing especially on the changes introduced with NuGet 3. You may also be interested in some related questions:
这个答案建立在
为了服务于所描述的平台集,您需要将您的解决方案相应地构建到多个 class 库项目中:
- .NET Framework 4.6 的 platform-specific class 库。
- 通用 Windows 平台的 platform-specific class 库。
- 针对常见 API 表面的便携式库。
您需要实现以下 NuGet 包结构:
\---lib
+---dotnet
| MyPortableLibrary.dll
| MyPortableLibrary.pdb
| MyPortableLibrary.XML
|
+---net46
| MyDotNetLibrary.dll
| MyDotNetLibrary.pdb
| MyDotNetLibrary.XML
| MyPortableLibrary.dll
| MyPortableLibrary.pdb
| MyPortableLibrary.XML
|
\---uap10.0
| MyPortableLibrary.dll
| MyPortableLibrary.pdb
| MyPortableLibrary.XML
| MyUwpLibrary.dll
| MyUwpLibrary.pdb
| MyUwpLibrary.pri
| MyUwpLibrary.XML
|
\---MyUwpLibrary
HashControl.xaml
MyUwpLibrary.xr.xml
如果您已经熟悉上面链接的其他答案,那么您应该比较熟悉。唯一特别的地方是便携库一共有三个副本,因为它的内容是为所有目标平台提供的。
可以使用基于以下模板的 nuspec 文件来实现所需的包结构:
<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata minClientVersion="3.2">
<id>Example.MyMultiSurfaceLibrary</id>
<version>1.0.0</version>
<authors>Firstname Lastname</authors>
<description>Example of a multi-platform library that exposes different API surfaces to .NET 4.6 and UWP and also includes a portable component.</description>
<dependencies>
<!-- UWP has more dependencies than other platforms (Newtonsoft.Json). -->
<group targetFramework="uap10.0">
<dependency id="Newtonsoft.Json" version="8.0.1" />
<dependency id="System.Linq" version="4.0.0" />
<dependency id="System.Numerics.Vectors" version="4.1.0" />
<dependency id="System.Resources.ResourceManager" version="4.0.0" />
<dependency id="System.Runtime" version="4.0.20" />
</group>
<!-- All other platforms - just the dependencies of the portable library here. -->
<group>
<dependency id="System.Linq" version="4.0.0" />
<dependency id="System.Numerics.Vectors" version="4.1.0" />
<dependency id="System.Resources.ResourceManager" version="4.0.0" />
<dependency id="System.Runtime" version="4.0.20" />
</group>
</dependencies>
</metadata>
<files>
<file src="..\bin\Release\MyPortableLibrary.*" target="lib\net46" />
<file src="..\bin\Release\MyPortableLibrary.*" target="lib\uap10.0" />
<file src="..\bin\Release\MyPortableLibrary.*" target="lib\dotnet" />
<file src="..\..\MyDotNetLibrary\bin\Release\MyDotNetLibrary.*" target="lib\net46" />
<!-- Double wildcard also ensures that the subdirectory is packaged. -->
<file src="..\..\MyUwpLibrary\bin\Release\MyUwpLibrary**" target="lib\uap10.0" />
</files>
</package>
请注意,定义了两组独立的依赖项:一组 general-purpose 组和一组特定于通用 Windows 平台,因为 UWP 库对 Newtonsoft.Json 包有额外的依赖性.您可以将相同的模式扩展到具有 platform-specific 依赖关系的任意数量的平台。
就是这样 - 这个 NuGet 包现在可以安装到 .NET Framework 4.6 项目、通用 Windows 平台项目和面向兼容 API 界面的可移植库项目中。可移植库的功能将在所有平台上导出,platform-specific 库也在适当的平台上使用。
记得在创建 NuGet 包之前使用 Release 配置构建您的解决方案。
示例库和相关打包文件为available on GitHub。这个答案对应的解决方案是MultiSurfaceLibrary.