【问题标题】:How am I supposed to be building NuGet packages?我应该如何构建 NuGet 包?
【发布时间】:2018-07-17 01:55:20
【问题描述】:

我想将一些功能提供给我正在进行的许多项目。所以很自然地我想我应该制作一个 NuGet 包来包含共享代码。所以我:

  1. 创建了一个类库(在本例中称为 ADUserCacheUsage)。
  2. 修复了该类库的程序集信息。
  3. 进入ADUserCacheUsage.csproj 的目录,然后在命令窗口中进行nuget spec。这会生成一个.nuspec 文件。
  4. 为我的项目修复了那个 nuspec 文件。
  5. nuget pack ADUserCacheUsage.csproj -Build -Symbols -Properties Configuration=Release(毕竟,如果有人在外部使用这个包,他们只需要发布版本,对吧?)
  6. nuget add ADUserCacheUsage.1.0.0.nupkg -source "C:\Program Files (x86)\Microsoft SDKs\NuGetPackages"

太好了,当我在包管理器中选择机器源时,我的 NuGet 包就会显示出来。所以我可以在我的项目中使用它。

我正在制作一个示例网页来使用它。该示例所做的只是调用一个函数并将结果输出到网页上。

问题是,每当我尝试在调试模式下运行此示例项目时,都会收到警告消息

您正在调试 ADUserCacheUsage.dll 的发布版本。

所以大概我应该在我的包中包含我的类库的调试版本,除了发布版本,对吧?我不希望示例项目的最终版本打扰调试信息,可能会变得缓慢和臃肿(诚然,对于一个只是一个示例的项目来说问题不大,但我正在考虑最佳实践和未来我可能会有一个更大、更复杂的包)。

但我希望能够在调试中运行而不会出现此错误。每当我创建一个 Web 项目时,它都会包含许多其他项目,并且它从来没有给我这个错误,例如,NewtonSoft.json。那么我应该怎么做才能以正确的方式做到这一点? nuget.org 上的每个包都只包含调试版本吗?

【问题讨论】:

  • 首先很多包不包含符号(例如 Newtonsoft.Json)。其次,这可能只是您构建 dll 的机器上的问题,因为调试器能够从 pdbs 中的信息中找到源文件。在没有源代码的另一台机器上,您将无法调试到库中。
  • 您将 Release 指定为您的构建配置。将其更改为调试,PDB 将被包括在内
  • 但是应该我指定调试版本吗? nuget.org 上的所有软件包是否都在分发其调试版本?
  • AFAIK,nuget.org 上的大多数包都不会分发它们的调试版本,因为它没有多大意义,NuGet 包通常只包含一组特定目标的程序集框架。它并不是真正设计用于发布调试和发布版本。请查看此线程:stackoverflow.com/questions/36053961/…stackoverflow.com/questions/47799179/… 了解详情。所以 NightOwl888 说的是对的。
  • @LeoLiu-MSFT 正如我所想。所以我指定了发布配置。但是我们又回到了我原来的问题:我收到一条错误消息,说我正在尝试调试一个发布 dll,但它只发生在我的包中。

标签: c# visual-studio visual-studio-2015 nuget


【解决方案1】:

NuGet 包不包含调试信息。

相反,有单独的 NuGet symbol packages (ending with .symbols.nupkg) 包含调试符号(.pdb 文件)和源代码文件。可以使用nuget pack -Symbolsdotnet pack --include-symbols 命令工具创建符号包。

创建和托管符号包后(在symbol server 或本地文件系统上),您可以configure Visual Studio 使用它们来逐步执行代码,即使 NuGet 包中的代码已构建使用Release 模式。

【讨论】:

  • 所以如果你不指定-Properties Configuration=Release,它仍然会进行发布构建,但不会触发错误消息?
猜你喜欢
  • 2011-12-07
  • 2016-12-21
  • 1970-01-01
  • 2011-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多