如何使用符号和源代码打包和部署NuGet软件包,以便调试器可以使用THAT源代码?

时间:2019-04-17 21:48:26

标签: c# visual-studio visual-studio-2017 nuget visual-studio-debugging

我已经从.net框架visual studio类库项目中创建了一个非常简单的NuGet包,其中类库的源代码是C#。

我使用以下命令创建nuget包:

nuget pack MyProject.csproj -symbols -Properties "Configuration=Debug" -suffix debug

如我所料,哪个会创建两个nuget包文件,即:

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

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

考虑到重复,我将文件MyProject.1.0.0-debug.symbols.nupkg重命名为MyProject.1.0.0-debug.nupkg,它将覆盖其中一个文件,没什么大不了的。现在,我有了一个常规命名的程序包,其中包含PDB和源文件。

我通过以下方式将其部署到内部文件共享供稿中:

nuget add MyProject.1.0.0-debug.nupkg \\InternalShare\FeedFolder

在一个完全不同的项目和一个不同的解决方案中,我现在使用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

我怎么了?

非常感谢。

==================补充信息2019年4月17日,太平洋时间3:30 ================= ======

这并没有我想的那么糟。当我尝试进入代码并说找不到时,我有机会浏览到代码,因此可以浏览到程序包(假设我知道它在哪里!),然后将调试器设置为松散并一切正常。令人高兴的是,Visual Studio似乎记住了我浏览过的地方,并且知道下次可以在那儿浏览。不确定该机制。

AND ....如果我转到原始计算机(上面有实际的软件包源),并且更改了原始源,例如准备下一个软件包,那么调试器(当然)会意识到来源已更改,同样提示我在其他地方寻找合适的来源。

尽管如此,不必跳这样的循环还是很棒的,所以我仍将不胜感激。

2 个答案:

答案 0 :(得分:2)

一些基本原理:

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

下一步:

  1. 参见nuget.org(.snupkg)的doc for creating and publishing symbols package
  2. 然后,查看此doc for configuring visual studio to for using NuGet.org as a symbol source(在添加符号服务器https://symbols.nuget.org/download/symbols时使用此值)

答案 1 :(得分:1)

早在2019年2月,它就开始工作了。

此处未提及,我添加到csproj文件中的一些内容是

<DebugSymbols>true</DebugSymbols>
<EmbedAllSources>true</EmbedAllSources>
<DebugType>portable</DebugType>

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

nuget pack mynuget.nuspec -Symbols -SymbolPackageFormat snupkg

当时我使用的是VS 15.9.4和nuget 4.9.3,因此我可以从网络路径成功调试nuget。不确定最近发布的版本有什么变化,现在无法正常工作。