Nuget的最佳实践:调试还是发布?

gza*_*zak 84 debugging release visual-studio nuget

目前,我将发布版本与Nuget一起打包到nuget.org的官方版本,但是我使用Nuget将调试版本打包为符号源推送到symbolsource.org.

编辑:( Jon Skeet,与Noda Time开发有一些偏见)

NuGet现在支持推送到NuGet gallery symbolsource.org(或类似的服务器),如文档所述.不幸的是,这里有两个相互矛盾的要求:

  • 当只使用库而不需要调试时,你真的想要一个发布版本.毕竟,这就是发布版本的用途.
  • 在调试库以进行诊断时,您确实需要一个禁用所有适当优化的调试版本.毕竟,那就是调试构建的目的.

这没关系,但是NuGet没有(据我所知)允许在同一个包中以有用的方式发布发布和调试版本.

所以,选择是:

  • 将调试版本分发给每个人(如文档中的示例所示),并使用任何大小和性能命中.
  • 将发布版本分发给每个人,并且稍微有点受损的调试体验.
  • 寻找一个非常复杂的分发策略,可能提供单独的发布和调试包.

前两个真正归结为调试和发布版本之间差异的影响......虽然值得注意的是,想要进入库代码之间也存在很大差异,因为你想要检查一些行为,并且想要调试库的代码,因为你相信你发现了一个bug.在第二种情况下,最好将库的代码作为Visual Studio解决方案并以这种方式进行调试,因此我不会过多关注这种情况.

我的诱惑是继续发布版本,期望相对较少的人需要调试,并且那些不会受发布版本中的优化影响很大的人.(无论如何,JIT编译器完成了大部分优化.)

那么,我们还没有考虑过其他选择吗?是否有其他考虑因素可以达到平衡?将NuGet软件包推向SymbolSource是否足够新,"最佳实践"真的还没有建立?

小智 28

对于SymbolSource,我认为最佳做法是:

  1. 仅将二进制+内容包推送到nuget.org(或任何其他生产订阅源)
  2. 将调试二进制+内容包推送到开发订阅源:
    • 预置
    • 在myget.org上
    • 在nuget.org上作为预发布包.
  3. 将发布和调试二进制+符号包推送到symbolsource.org或任何其他符号存储.

虽然我们正在使用它,但是一个常见的误解是.NET中的发布和调试版本确实有很大不同,但我假设差异在这里是因为各种代码可能包含或可能不包含在任何一个版本中,例如Debug .Asserts.

也就是说,将这两种配置推送到SymbolSource真的是值得的,因为你永远不知道什么时候需要调试生产代码.远程生产使其更难.当发生这种情况时,您将需要从工具中获得的帮助.我显然不希望任何人.

关于版本控制还有一个问题需要考虑:让2个不同的软件包(内置在调试版和发布版中)共享1个版本号是否正确?SymbolSource会接受这一点,因为它在单独的构建模式分支中提取包并存储二进制文件,因此只允许NuGet相应地标记包.目前无法确定包是调试还是释放模式.


Ale*_*aus 7

OP 发表帖子已经过去 8 年了(之前的答案仍然在下面投票最高),所以我将用现在使用的内容来尝试一下。

\n

有两种“步入”NuGet 包的方法:

\n

1. PDB的分布

\n

.symbols.nupkg符号包被视为旧版,并已被发布到Symbol Server 的.snupkg包所取代。它\xe2\x80\x99s 受到大多数供应商的支持,其中Azure DevOps是最大的局外人,其功能请求仍在“审核中”(感谢@alv 提供的链接)。

\n

以下是官方说明。只需将这两行添加到 csproj 文件中:

\n
<PropertyGroup>\n  <IncludeSymbols>true</IncludeSymbols>\n  <SymbolPackageFormat>snupkg</SymbolPackageFormat>\n</PropertyGroup>\n
Run Code Online (Sandbox Code Playgroud)\n

在使用者方面,请确保您的 IDE 已针对 NuGet.org(或 Azure 等)符号服务器进行配置,以允许在调试时单步执行包代码

\n

2. 源码链接。链接实际代码

\n

在某些情况下,由于 MSIL/JIT 优化,PDB 可能会隐藏源代码的一些细节。因此,有一种方法可以在调试时 \xe2\x80\x9d进入NuGet 的实际源代码 \xe2\x80\x9d 。它\xe2\x80\x99s 被称为来自.NET Foundation \xe2\x80\x93 \xe2\x80\x9d 的源链接,这是一个与语言和源代码控制无关的系统,用于为二进制文件\xe2\x80\x9c提供源调试体验。

\n

Visual Studio 15.3+ 和所有主要供应商都支持它\xe2\x80\x99s(还支持私有存储库)。

\n

\xe2\x80\x99s 的设置很简单(官方文档) \xe2\x80\x93 只需向项目文件添加开发依赖项(取决于您的存储库的类型)以及一些标志:

\n
<PropertyGroup>\n    <PublishRepositoryUrl>true</PublishRepositoryUrl>\n    <EmbedUntrackedSources>true</EmbedUntrackedSources>\n</PropertyGroup>\n<ItemGroup>\n  <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="All" />\n</ItemGroup>\n
Run Code Online (Sandbox Code Playgroud)\n

在“更好的 NuGet 包的 5 个步骤”中查看有关此主题的更多信息。

\n

  • 问题是:调试还是发布? (4认同)