关于如何在Nuget包中使用Symbols、Source files和Source Link进行调试,互联网上有几种记录在案的方法,但老实说,很难理解哪种方法对我来说是好的。
我们有一台Azure Nuget服务器,我们在其上生成DevOps包,同时使用构建管道中的described here任务将.pdb
文件发布到Azure DevOps符号服务器
我的项目‘在.csproj
文件中还引用了Microsoft.SourceLink.Vsts.Git
和以下代码
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<EmbedUntrackedSources>true</EmbedUntrackedSources>
我读过几篇博客文章,但我最相信的更新来源当然是官方Source Link Git repository。
readme.md
文件说
通常不再推荐在.nupkg中包含PDB的
,因为这样会增加软件包的大小,从而恢复使用软件包的项目的时间,而不管用户是否需要通过库的源代码进行调试
我同意这一点,这就是为什么我要使用Symbol Server,而不是将.pdb
文件包含在Nuget包中。因此,请不要将我的问题标记为this one的副本,因为被接受的答案正是我不想做的。
自述文件还指出,
.snupkg符号包有一些限制:
所以至少我知道我不能用它。
但是什么才是正确的设置Source Link并工作的方法呢?
当我调试我的测试控制台应用程序时,它成功地将.pdb
文件下载到我的Symbols缓存文件夹中,但是如果我尝试使用F11
单步执行来自我的Nuget包的代码,它就不能工作。(但是,它会步入System.String.Concat
,因为我的简单测试Nuget包实际上是连接一些字符串)
我试图运行sourcelink test TestSourceLink.pdb
,但我得到了一个error: url hash does not match
。我在here上读到sourcelink test
是一个遗留的东西,不支持像我们这样的私有存储库的身份验证。
使用我的浏览器,如果我访问sourcelink print-json TestSourceLink.pdb
提供的网址,我可以看到最新的源代码。但现在的问题是,为什么Visual Studio无法下载源代码?我在VS中通过了这个Azure DevOps服务器的身份验证,因为我能够安装来自这个服务器的Nuget包。
以下是我的调试设置:
非常感谢。我真的搞不懂这块拼图缺失的部分是什么
发布于 2019-03-04 18:07:57
嗯,在发布我的问题之前,我应该阅读并关注this answer,因为这是拼图中缺失的一部分。
我需要遵循Eric's blog post的步骤5和6,但实际上我不需要修改我的pack
命令,因为我没有在Nuget包中包含.pdb
文件。
编辑2
注意:到目前为止,只有在使用调试构建配置生成Nuget包的情况下,我才能让它正常工作。如果你能找到在Nuget包中使用发布动态链接库的源码链接,请回答my other question。谢谢
编辑:因为我为我的公司写了一份文档,所以它是:
摘要:
这需要两件事:
Visual Studio可以访问项目的符号文件(.pdb
),该文件是debugger
时应从何处下载源代码
设置:
组件的项目
对于解决方案中的每个项目:
如果您计划Nuget包的消费者使用Visual Studio2017,请使用
在Visual Studio中,右键单击项目-> Properties
,然后转到Build -> Advanced
并将Debugging Information
从Portable
(缺省值)更改为Full
.csproj
文件,并在第一个PropertyGroup
元素中包含以下代码: <PublishRepositoryUrl>true</PublishRepositoryUrl>
<EmbedUntrackedSources>true</EmbedUntrackedSources>
Azure DevOps构建管道
BuildConfiguration
的管道变量(如果该变量尚不存在),并将其值设置为Debug
- Use this variable as argument in your `.NET Core Build` task: `--configuration $(BuildConfiguration)`
- In your `.NET Core Pack` task, use this variable in the `Configuration to Package` field: `$(BuildConfiguration)`
在流水线的末尾,你必须有一个任务Index Sources & Publish Symbols
(
- In the `Artifact name` field, the `BuildConfiguration` variable must be used too: `Symbols_$(BuildConfiguration)`
当然,您还必须有一个.NET Core Push
任务才能将您的Nuget包推送到您的Azure DevOps Nuget Feed
Visual Studio
Tools -> Options -> Debugging -> Symbols
单击New Azure DevOps Symbol Server Location...
按钮并向服务器进行身份验证C:\Symbols\
。这就是你所有的stored文件的.pdb
文件
Tools -> Options -> Debugging -> Symbols
单击Load only specified modules
。您可以在此处指定要加载的DLL的符号文件。如果您不这样做并将默认值保留为Load all modules, unless excluded
,则当您在调试模式下运行程序时,Visual Studio将花费非常长的时间来加载所有内容。
提示:要查看项目加载的所有all,请在调试时单击Debug -> Windows -> Modules
。从这里您可以查看完整的列表,选择multiple,然后右键单击Copy Value -> Copy Name
取消选中Enable Just My Code
Enable source server support
Enable Source Link Support
的
Tools -> Options -> Debugging -> General
消费项目
当您想要在Nuget包的代码中进行调试时,很自然地按下F11
进入其中,Visual Studio将询问您是否同意从您的Azure DevOps存储库下载源代码
https://stackoverflow.com/questions/54980381
复制相似问题