目前,我包的发布版本与对的NuGet正式建立于nuget.org,但我包的调试版本与对的NuGet符号源推向symbolsource.org。
编辑:(乔恩斯基特,与野田开发的时间有些偏)
现在的NuGet支持推动双方的NuGet画廊和 symbolsource.org(或类似的服务器), 如记录 。 不幸的是,这里有两个相互矛盾的需求:
- 当只使用一个库,而无需任何调试,你真的想要一个发布版本。 这就是发布版本是,毕竟。
- 当调试成用于诊断目的的图书馆,你真的想要一个调试建立与禁用所有适当的优化。 这就是调试版本是对的,毕竟。
这将是很好,但的NuGet不(据我可以告诉),同时允许释放和调试版本将发表在一个有用的方法,在同一个包。
所以,选用的是:
- 分发调试版本给大家(如在文档的例子),并与任何尺寸和性能的命中居住。
- 分发发布版本给大家,并用轻微受损调试体验生活。
- 走了很复杂的分配政策,有可能提供单独的释放和调试包。
前两个真的归结为的调试和发布之间的差异的影响建立......虽然这是值得注意的是,这里还有希望,因为你要检查一些行为步入库的代码之间有很大的区别,并希望因为你相信你已经发现了一个bug调试库的代码。 在第二种情况下,它可能会更好,以使该库的代码作为Visual Studio解决方案和调试这种方式,所以我不会付出太多理会这种情况。
我的诱惑是只保留与发行版本,与相对很少有人会需要调试的期望,谁做的人不会受到影响由发布版本优化了 。 (JIT编译器做最优化的反正。)
那么,我们没有考虑到还有其他的选择吗? 是否有其他考虑因素打破平衡? 正在推动的NuGet包SymbolSource足够新说,“最佳实践”真的尚未确定?
说到对SymbolSource,我认为最好的做法是:
- 按压释放二进制+内容包只nuget.org(或任何其他生产饲料)
- 推调试二进制+内容包开发饲料:
- 预置
- 在myget.org
- 在nuget.org作为预发行包。
- 按发布和调试二进制符号+包symbolsource.org或任何其他符号存储。
虽然我们在这,它是释放和调试版本的.NET确实太大差别,但我假设分化的,因为这可能会或可能不会被包括在完成构建,像调试各种代码在这里一个常见的误解.Asserts。
这就是说,它是真正值得推两种配置到SymbolSource,因为你永远不知道当你将需要调试的生产代码。 远程生产使其更难。 你会需要帮助,你可以从你的工具得到当这种情况发生。 这我显然没有任何人后希望。
还有要考虑关于版本的问题:这是正确的有2个不同的包(在调试和发布版本),分享1版本号? SymbolSource会接受,因为它提取包和二进制文件存储在单独的生成模式的分支,如果只允许的NuGet相应标记的包。 没有办法在本,以确定包是否调试或释放模式。
我完全你的结论一致。 的NuGet软件包与RELEASE和SymbolSource与调试。 这似乎相当罕见,直接步入包,并与优化偶尔调试失误启用是可以接受的。
如果有一个真正的问题,我认为理想的解决办法是让的NuGet支持。 例如,想象一下,如果在调试时,它可以在更换释放DLL与在SymbolSource包包括一个。
理想的情况下,有什么会怎样是nuget pack SomePackage -Symbols
对一个发布版本将创建一个发布的NuGet包,但调试符号包。 而VS插件将被更新以足够的智慧看到的关联,并在调试器中运行时调试组件拉和加载这些来代替。 那种疯狂,但是会很有意思。
不过,我只是没有看到足够多的人抱怨这一点,它会是值得的时刻。
的NuGet队接受拉请求。 :)
在这个例子创建和发布符号封装在Debug目录作为来源的dll和pdb文件引用的文件。
指定符号包装内容
符号包可以通过约定来建造,从在上一节中所描述的方式构成的文件夹,或可以使用将文件部分中指定的内容。 如果你想建立之前描述的例子包,你可以把这个到您的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>
由于出版符号的目的是为了让别人来调试时,逐步执行代码,似乎最谨慎发布一个版本用于调试的代码没有可能影响通过代码优化。