如何打包.NET Framework库?

时间:2016-01-05 12:33:33

标签: .net nuget nuget-package

如何以现代通用方式打包.NET库以便通过NuGet发布?让我们假设我有一个AnyCPU程序集,我希望在.NET Framework 4.6平台上提供。

  

这是一系列问题和答案,记录了我对现代NuGet包创作主题的研究结果,特别关注NuGet 3引入的变化。您可能也对一些相关问题感兴趣:

     

1 个答案:

答案 0 :(得分:13)

您需要创建和发布包含以下内容的NuGet包:

  • 包含代码(.dll)的程序集。
  • 调试符号文件(.pdb)。
  • XML文档文件(.xml),假设您已在项目设置中启用它。

虽然发布代码的原因很明显,但另外两个值得扩展:

  • 调试符号文件使运行时能够使用代码的行号填充堆栈跟踪,还可以向附加的调试器提供其他信息。将此文件包含在NuGet包中是一种非常简单的方法,可以增强与库相关的故障排除体验。
  • Visual Studio使用XML documentation file来显示工具提示,这些工具提示提供有关方法及其对库用户的参数的文档。这样可以避免引用外部文档,从而提高库的可用性。

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。