如何打包和部署带有符号和源代码的 NuGet 包,以便调试器可以使用该源代码?

Ste*_*n G 11 c# visual-studio visual-studio-debugging nuget visual-studio-2017

我从 .net 框架 Visual Studio 类库项目创建了一个非常简单的 NuGet 包,其中类库源在 C# 中。

我使用这个命令来创建 nuget 包:

nuget pack MyProject.csproj -symbols -Properties "Configuration=Debug" -suffix debug
Run Code Online (Sandbox Code Playgroud)

正如我所料,它创建了两个 nuget 包文件,即:

  • MyProject.1.0.0-debug.symbols.nupkg
  • MyProject.1.0.0-debug.nupkg

除了带有“符号”的包包括 lib 层次结构中的 pdb 文件和 src 文件夹中的源文件之外,这些包基本上是相同的。

鉴于重复,我将文件重命名MyProject.1.0.0-debug.symbols.nupkgMyProject.1.0.0-debug.nupkg,这会覆盖其中一个文件,这没什么大不了的。我现在有一个传统命名的包,其中包含 PDB 和源文件。

我将其部署到内部文件共享提要:

nuget add MyProject.1.0.0-debug.nupkg \\InternalShare\FeedFolder
Run Code Online (Sandbox Code Playgroud)

在一个完全不同的项目和不同的解决方案中,我现在使用 NuGet 包管理器在 Visual Studio 中使用该 NuGet 包。一切都很好。并且代码也能正常工作,在我的例子中,我制作了一个简单的控制台应用程序,它使用了包中的几个类,并且我已经证明它可以正确使用它们并且没有发生任何事故。

到现在为止还挺好。

现在我在消费代码中设置一个断点,并尝试进入源代码调试包。它似乎工作正常,但实际上,它没有进入随包分发的源代码。它实际上从包的创建开始进入原始源代码,在我的机器上完全不同且不相关的文件夹层次结构中。

好的。所以现在我在没有原始源的单独计算机上重新创建我的简单控制台应用程序。在那台单独的计算机上,它位于内部网络上,因此可以访问文件共享,我使用 NuGet 包,再次,一切都编译并正常工作。

但是,当我尝试进入 Visual Studio 调试器中的包源代码时,它根本不起作用。调试器无法找到源代码,即使它就在包文件夹中。(调试器提供反汇编代码——不是很有帮助)。

这似乎应该是一个常见的用例,并且希望在 nuget 包中包含符号和源代码,所以我必须做一些愚蠢的事情,以至于调试器找不到源代码。

各种版本的东西:

  • Visual Studio:专业版 2017 15.9.11
  • VS 中安装的 NuGet 包管理器:4.6.0
  • CLI NuGet 版本:4.8.1.5435
  • 我的示例代码的目标 .NET Framework:4.6.1

我的错误是什么?

提前谢谢了。

================== 添加信息 4/17/2019,太平洋时间下午 3:30 ==================== ===

这并不像我想象的那么糟糕。当我尝试进入代码并说找不到它时,我有机会浏览到代码,因此我可以浏览到包(假设我知道它在哪里!)并将调试器设置为宽松和一切正常。好消息是 Visual Studio 似乎记得我浏览过的地方,并且知道下次去那里看看。不确定那个机制。

并且....如果我转到我的原始计算机(上面有实际的包源),如果我更改了初始源,就像我为下一个包做准备一样,调试器(当然)会意识到源已更改,同样提示我在别处寻找合适的来源。

尽管如此,不必像那样跳过篮球会很棒,所以我仍然很感激任何进一步的见解。

use*_*876 7

早在 2019 年 2 月,它就可以工作了。这里没有提到并且我添加到 csproj 文件中的几件事是

<DebugSymbols>true</DebugSymbols>
<EmbedAllSources>true</EmbedAllSources>
<DebugType>portable</DebugType>
Run Code Online (Sandbox Code Playgroud)

我用nuget打包,使用的命令是:

nuget pack mynuget.nuspec -Symbols -SymbolPackageFormat snupkg
Run Code Online (Sandbox Code Playgroud)

我当时使用的是 VS 15.9.4 和 nuget 4.9.3 有了这个我可以从网络路径成功调试 nuget 。不确定最近版本中发生了什么变化,它现在不起作用。


小智 3

一些基础知识:

  • 调试器需要 PDB 来启用调试
  • 符号包应该包含 PDB(它不仅仅是具有不同扩展名的包)
  • 此符号包应发布到符号存储库,Visual Studio 调试器可以从中请求符号

下一个:

  1. 请参阅此文档,了解如何创建符号包并将其发布到 nuget.org (.snupkg)
  2. 然后,请参阅此文档以配置 Visual Studio 以使用 NuGet.org 作为符号源(添加符号服务器时使用此值https://symbols.nuget.org/download/symbols