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

jqjz2hbq  于 2023-04-22  发布在  其他
关注(0)|答案(3)|浏览(170)

我从一个.net framework visual studio Class Library项目中创建了一个非常简单的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

这些包基本上是相同的,除了带有“symbols”的包包括lib层次结构中的pdb文件和src文件夹中的源文件。
考虑到重复,我将文件MyProject.1.0.0-debug.symbols.nupkg重命名为MyProject.1.0.0-debug.nupkg,这将覆盖其中一个文件,这没有什么大不了的。
我将其部署到一个内部文件共享提要:

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

在一个完全不同的项目和不同的解决方案中,我现在在Visual Studio中使用NuGet包管理器来使用NuGet包。所有工作都很好。代码也很好,在我的案例中,我制作了一个简单的控制台应用程序,它使用了包中的几个类,我已经证明它正确地使用了它们,没有发生任何意外。
到目前为止一切顺利。
现在,我在使用代码中设置了一个断点,并尝试单步执行源代码以调试包。它似乎可以正常工作,但实际上,它并没有进入与包一起分发的源代码。它实际上是从创建包开始单步执行ORIGINAL源代码,在我的机器上的一个完全不同且不相关的文件夹层次结构中。
好了。现在我在一台没有原始源代码的 * 单独 * 计算机上重新创建了我的简单控制台应用程序。在这台单独的计算机上,它位于内部网络上,因此可以访问文件共享,我使用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似乎记得我浏览到了哪里,并知道下次在那里查看。我不确定这个机制。
并且....如果我去我的原始计算机(上面有实际的包源代码),如果我改变了初始源代码,就像我准备下一个包一样,调试器(当然)意识到源代码已经改变了,同样提示我在其他地方寻找合适的源代码。
尽管如此,如果不需要像那样跳过铁环就太好了,所以我仍然会感激任何进一步的见解。

falq053o

falq053o1#

早在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。不知道最近的版本有什么变化,现在不工作了。

wgxvkvu9

wgxvkvu92#

一些基本原则:

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

下一页:
1.请参阅此doc for creating and publishing symbols package到nuget.org(.snupkg)
1.然后,请参阅此文档,将visual studio配置为使用NuGet.org作为符号源(在添加符号服务器https://symbols.nuget.org/download/symbols时使用此值)

dwbf0jvd

dwbf0jvd3#

我也遇到了类似的问题--想(在公司内部)导出一个完整的nuget库,包括源代码和调试代码的选项。
我尝试了所有的排列组合

  • 带符号的金块包
  • 带源代码和符号的网络包
  • 旧的X.symbol.nupkg与新的X.snupkg

没有一个能像预期的那样工作,要么是源代码被反编译而不是原始的;没有智能感知文档;找不到符号;或者它们是在原始的nuget lib源目标中找到的,所以它只在我的DEV机器上工作,甚至直到原始源被更改。
最后,对我起作用的方法非常简单:)csproj PropertyGroup with

  • <GenerateDocumentationFile>True</GenerateDocumentationFile>用于IntelliSense文档
  • <EmbedAllSources>true</EmbedAllSources>用于共享源
  • <DebugType>Embedded</DebugType>用于共享调试符号

Nuget打包和推送到本地网络驱动器也很简单:

  • dotnet pack -c Release -o .
  • dotnet nuget push .\<package_name>.nupkg --source <network_location>

希望它能帮助其他人。

相关问题