如何以现代通用方式打包.NET库以便通过NuGet进行发布?假设我有一个AnyCPU程序集,我希望在.NET Framework 4.6平台上提供.
这是一系列问题和答案,记录了我对现代NuGet包创作主题的研究结果,特别关注NuGet 3引入的变化.您可能还对一些相关问题感兴趣:
如何打包面向通用Windows平台的.NET库?
如何打包面向.NET Core的可移植.NET库?
如何打包面向.NET Framework和通用Windows平台的.NET库并包含特定于平台的功能?
如何打包一个针对通用Windows平台的多架构.NET库?
如何打包一个针对通用Windows平台并依赖于Visual Studio扩展SDK的.NET库?
Sander.. 15
您将需要创建和发布具有以下内容的NuGet包:
包含代码(.dll)的程序集.
调试符号文件(.pdb).
XML文档文件(.xml),假设您已在项目设置中启用它.
虽然发布代码的原因很明显,但另外两个值得扩展:
调试符号文件使运行时能够使用代码的行号填充堆栈跟踪,还可以向附加的调试器提供其他信息.在NuGet包中包含此文件是一种非常简单的方法,可以增强与库相关的故障排除体验.
该XML文档文件是使用Visual Studio中显示提供有关方法及其参数库的用户文档工具提示.这样可以避免引用外部文档,从而提高库的可用性.
从本质上讲,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包的结构,请使用以下作为模板在同一目录(例如MyLibrary.nuspec)中创建.nuspec文件:
Example.MyLibrary 1.0.0 Firstname Lastname Example of a simple .NET Framework 4.6 library.
确保将nuget.exe和.nuspec文件的构建操作设置为None,以避免它们被构建过程不必要地触及.
如果您的项目是根据标准Visual Studio项目模板配置的,则项目的所有三个相关输出(MyLibrary.dll,MyLibrary.xml和MyLibrary.pdb)将出现在bin\Release目录和示例中的通配符模式中将所有这些复制到NuGet包中的适当位置.
依赖项列表应该镜像项目目录中的packages.config文件.如果您的库与其他NuGet包没有依赖关系,您可以简单地省略该
元素.
在继续之前,使用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.
您将需要创建和发布具有以下内容的NuGet包:
包含代码(.dll)的程序集.
调试符号文件(.pdb).
XML文档文件(.xml),假设您已在项目设置中启用它.
虽然发布代码的原因很明显,但另外两个值得扩展:
调试符号文件使运行时能够使用代码的行号填充堆栈跟踪,还可以向附加的调试器提供其他信息.在NuGet包中包含此文件是一种非常简单的方法,可以增强与库相关的故障排除体验.
该XML文档文件是使用Visual Studio中显示提供有关方法及其参数库的用户文档工具提示.这样可以避免引用外部文档,从而提高库的可用性.
从本质上讲,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包的结构,请使用以下作为模板在同一目录(例如MyLibrary.nuspec)中创建.nuspec文件:
Example.MyLibrary 1.0.0 Firstname Lastname Example of a simple .NET Framework 4.6 library.
确保将nuget.exe和.nuspec文件的构建操作设置为None,以避免它们被构建过程不必要地触及.
如果您的项目是根据标准Visual Studio项目模板配置的,则项目的所有三个相关输出(MyLibrary.dll,MyLibrary.xml和MyLibrary.pdb)将出现在bin\Release目录和示例中的通配符模式中将所有这些复制到NuGet包中的适当位置.
依赖项列表应该镜像项目目录中的packages.config文件.如果您的库与其他NuGet包没有依赖关系,您可以简单地省略该
元素.
在继续之前,使用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.