如何打包一个.NET Framework库?

12
我该如何以现代通用的方式打包 .NET 库,以便通过 NuGet 进行发布?假设我有一个单一的 AnyCPU 程序集,我希望在 .NET Framework 4.6 平台上提供它。
这是一系列关于现代NuGet包编写的问题与答案,特别关注介绍NuGet 3引入的变化。您可能还对以下相关问题感兴趣: - 如何打包针对通用Windows平台的.NET库? - 如何打包针对.NET Core的可移植.NET库? - 如何打包针对.NET Framework和通用Windows平台的.NET库,并包括平台特定功能? - 如何打包针对通用Windows平台的多架构.NET库? - 如何打包针对通用Windows平台的.NET库,并依赖于Visual Studio扩展SDK?

1
@CodeCaster 抱歉,我在尝试编辑时网络掉了。是的,这是我的错误。 - Basic
1个回答

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软件包结构,请在相同的目录中创建一个.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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接