如何以现代通用方式打包.NET库以便通过NuGet发布?让我们假设我有一个AnyCPU程序集,我希望在.NET Framework 4.6平台上提供。
这是一系列问题和答案,记录了我对现代NuGet包创作主题的研究结果,特别关注NuGet 3引入的变化。您可能也对一些相关问题感兴趣:
- How to package a .NET library targeting the Universal Windows Platform?
- How to package a portable .NET library targeting .NET Core?
- How to package a .NET library targeting .NET Framework and Universal Windows Platform and include platform-specific functionality?
- How to package a multi-architecture .NET library that targets the Universal Windows Platform?
- How to package a .NET library that targets the Universal Windows Platform and depends on Visual Studio extension SDKs?
答案 0 :(得分:13)
您需要创建和发布包含以下内容的NuGet包:
虽然发布代码的原因很明显,但另外两个值得扩展:
NuGet包本质上是一个包含您的内容和一些元数据的zip文件。要发布此.NET库,您需要创建具有以下结构的包(省略元数据):
\---lib
\---net46
MyLibrary.dll
MyLibrary.pdb
MyLibrary.XML
简单地说,当程序包安装到.NET Framework 4.6项目中时,将使用lib \ net46中的所有内容,这正是您所需要的。所有这三个文件都来自Release build configuration下项目的构建输出目录。
创建此类NuGet包的最简单方法是使用NuGet命令行可执行文件。在解决方案中创建一个目录(例如MyLibrary \ NuGet)并将nuget.exe复制到此目录中。要定义库的NuGet包的结构,请使用以下内容作为模板在同一目录(例如MyLibrary.nuspec)中创建.nuspec文件:
<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata minClientVersion="3.2">
<id>Example.MyLibrary</id>
<version>1.0.0</version>
<authors>Firstname Lastname</authors>
<description>Example of a simple .NET Framework 4.6 library.</description>
<dependencies>
<dependency id="Newtonsoft.Json" version="8.0.1" />
</dependencies>
</metadata>
<files>
<file src="..\bin\Release\MyLibrary.*" target="lib\net46" />
</files>
</package>
确保将nuget.exe和.nuspec文件的构建操作设置为None,以避免构建过程不必要地触及它们。
如果您的项目是根据标准Visual Studio项目模板配置的,则项目的所有三个相关输出(MyLibrary.dll,MyLibrary.xml和MyLibrary.pdb)将出现在bin \ Release目录和通配符模式中在示例中,将所有这些复制到NuGet包中的适当位置。
依赖项列表应该镜像项目目录中的packages.config文件。如果您的库与其他NuGet包没有依赖关系,您可以简单地省略<dependencies>
元素。
在继续之前使用Release配置构建解决方案。
您可以使用命令nuget.exe pack MyLibrary.nuspec
创建包。这将生成一个以.nuspec文件中指定的ID命名的包,例如Example.MyLibrary.1.0.0.nupkg。您可以将此文件上传到您选择的NuGet软件包存储库,并像使用任何其他NuGet软件包一样直接使用它。
我发现使用PowerShell脚本启动NuGet包生成是有益的,特别是如果您需要执行内容的预处理,就像更复杂的项目一样。以下是PowerShell脚本的示例,该脚本将在同一目录中使用nuget.exe为同一目录中的所有.nuspec文件创建包:
# Delete any existing output.
Remove-Item *.nupkg
# Create new packages for any nuspec files that exist in this directory.
Foreach ($nuspec in $(Get-Item *.nuspec))
{
.\NuGet.exe pack "$nuspec"
}
如果将其包含在项目中,请确保将PowerShell脚本的构建操作设置为“无”,以避免构建过程不必要地触及它。
示例库和相关的打包文件为available on GitHub。与此答案对应的解决方案是SimpleNetFrameworkLibrary。