这是一系列关于现代NuGet包编写的问题与答案,特别关注介绍NuGet 3引入的变化。您可能还对以下相关问题感兴趣: - 如何打包针对通用Windows平台的.NET库? - 如何打包针对.NET Core的可移植.NET库? - 如何打包针对.NET Framework和通用Windows平台的.NET库,并包括平台特定功能? - 如何打包针对通用Windows平台的多架构.NET库? - 如何打包针对通用Windows平台的.NET库,并依赖于Visual Studio扩展SDK?
您需要创建并发布一个包含以下内容的NuGet软件包:
虽然发布代码的原因很明显,但其他两个值得更详细地解释一下:
NuGet软件包本质上是一个包含您内容和一些元数据的zip文件。要发布此.NET库,您需要创建一个具有以下结构的软件包(省略元数据):
\---lib
\---net46
MyLibrary.dll
MyLibrary.pdb
MyLibrary.XML
简单地说,当该软件包被安装到.NET Framework 4.6项目中时,lib\net46中的所有内容都将被使用,这正是您所需要的。这三个文件都将来自于您项目的构建输出目录,在Release构建配置下。
创建这样的NuGet软件包的最简单方法是使用NuGet命令行可执行程序。在解决方案中创建一个目录(例如MyLibrary\NuGet),并将nuget.exe复制到此目录中。为了定义您的库的NuGet软件包结构,请在相同的目录中创建一个.nuspec文件(例如MyLibrary.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脚本的构建操作设置为“无”,以避免它被构建过程不必要地修改。
一个示例库和相关的打包文件可以在GitHub上获取。与此答案对应的解决方案是SimpleNetFrameworkLibrary。