Nuget的最佳做法:debugging还是发布?

目前,我将发布版本与官方版本的Nuget一起打包到nuget.org,但是我用Nuget打包了debugging版本,将symbol source推送到symbolsource.org。

编辑:( Jon Skeet,有一些Noda时间发展的偏见)

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

  • 当仅仅使用一个库而不需要debugging的时候,你真的想要一个发布版本。 毕竟,这就是发布版本的目的。
  • 为了进行诊断而debugging到库中时,您确实需要一个debugging版本,并禁用所有适当的优化。 毕竟,这就是debugging版本的作用。

这样可以,但是NuGet并没有(据我所知)允许发布版本和debugging版本以一种有用的方式发布在同一个包中。

所以,select是:

  • 将debugging版本分发给每个人(如文档中的示例所示),并以任何大小和性能命中。
  • 将发布版本分发给每个人,并且存在稍微受损的debugging体验。
  • 寻找一个非常复杂的分发策略,可能会提供单独的发行版和debugging软件包。

前两个真正归因于debugging版本和发布版本之间差异的影响…虽然值得注意的是,想要进入库的代码之间也有很大的区别,因为您想检查一些行为,并且想要debugging库的代码,因为你相信你已经发现了一个错误。 在第二种情况下,将库的代码作为Visual Studio解决scheme并进行debugging可能会更好,所以我没有太在意这种情况。

我的诱惑是只保留发布版本,期望相对较less的人需要debugging,而那些做的不会受到发布版本中优化的影响。 (无论如何,JIT编译器会进行大部分优化。)

那么,还有其他的select,我们没有考虑? 是否有其他的考虑,以平衡? 将NuGet软件包推向SymbolSource是否足够新,以至于“最佳实践”还没有build立起来?

说到SymbolSource,我相信最好的做法是:

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

虽然我们这样做,但是在.NET中发布和debugging版本确实有很大差异,这是一个常见的误解,但是我认为这里的区别在于,因为可能包含或可能不包含在任何版本中的各种代码,比如Debug .Asserts。

也就是说,将两个configuration都推送到SymbolSource是非常值得的,因为您只是不知道什么时候需要debugging生产代码。 远程生产使其更难。 发生这种情况时,您需要从工具中获得帮助。 我显然不希望任何人。

在版本控制方面还有一个问题要考虑:有两个不同的软件包(内置debugging和发行版本)共享一个版本号是否正确? SymbolSource会接受,因为它提取软件包并将二进制文件存储在单独的构build模式分支中,所以只允许NuGet相应地标记软件包。 目前没有办法确定一个软件包是否是debugging模式或释放模式。

我完全同意你的结论。 NuGet包与RELEASE和SymbolSourcedebugging。 直接进入软件包似乎非常罕见,并且启用了优化的偶尔的debugging失误可能是可以接受的。

如果确实有问题,我认为理想的解决scheme是让NuGet支持它。 例如,想象一下,如果在debugging的时候,它可以用包含在SymbolSource包中的发行版DLLreplace。

理想情况下,那么会发生什么是nuget pack SomePackage -Symbols对发布版本将创build发布nuget包,但debugging符号包。 VS插件将被更新为足够聪明,以查看关联,并在debugging器中运行时拉入debugging程序集,然后加载它们。 有点疯狂,但会很有趣。

不过,我只是没有看到足够的人抱怨这件事现在是值得的。

NuGet团队接受拉请求。 🙂

“ 创build和发布符号包 ”中的示例将Debug目录中的文件引用为dll和pdb文件的源文件。

指定符号包的内容

一个符号包可以按照惯例build立起来,从前一节描述的方式构build的文件夹中,或者可以使用files部分指定其内容。 如果你想构build前面描述的示例包,你可以把它放到你的nuspec文件中:

 <files> <file src="Full\bin\Debug\*.dll" target="lib\net40" /> <file src="Full\bin\Debug\*.pdb" target="lib\net40" /> <file src="Silverlight\bin\Debug\*.dll" target="lib\sl40" /> <file src="Silverlight\bin\Debug\*.pdb" target="lib\sl40" /> <file src="**\*.cs" target="src" /> </files> 

由于发布符号的目的是为了让其他人在debugging时能够遍历代码,所以发布用于debugging的代码版本似乎是最为谨慎的,而不需要可能会影响代码步骤的优化。