使用 Azure DevOps 符号服务器的来源 Link
Source Link with an Azure DevOps Symbol Server
互联网上有几种关于如何使用 Symbols 源文件和 Source Link 在 Nuget 包中进行调试的方法,但老实说,我很难理解什么是好的方法。
我们有一个 Azure DevOps 服务器,我们在其上生成 Nuget 包,同时使用构建管道中的 Index Sources & Publish Symbols
任务将 .pdb
文件发布到 Azure DevOps 符号服务器 described here
我的项目'也引用了 Microsoft.SourceLink.Vsts.Git
和 .csproj
文件中的这段代码
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<EmbedUntrackedSources>true</EmbedUntrackedSources>
我已经阅读了几篇博文,但我最信任的最新消息来源当然是官方 Source Link Git repository。
readme.md
文件说
Including PDBs in the .nupkg is generally no longer recommended as it increases the size of the package and thus restore time for projects that consume your package, regardless of whether the user needs to debug through the source code of your library or not
我同意这一点,这就是为什么我要使用符号服务器,而不是将 .pdb
文件包含在 Nuget 包中。因此,请不要将我的问题标记为 的重复,因为接受的答案正是我不想做的。
自述文件还指出
.snupkg symbol packages have some limitations:
- They do not currently support Windows PDBs (generated by VC++, or for managed projects that set build property DebugType to full)
- They require the library to be built by newer C#/VB compiler (Visual Studio 2017 Update 9).
- The consumer of the package also needs Visual Studio 2017 Update 9 debugger.
- Not supported by Azure DevOps Artifacts service.
所以至少我知道我不能使用它。
但是设置 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
给出的URL,我可以看到最新的源代码。但是现在问题来了,为什么Visual Studio下载不到源码呢?我在 VS 中通过了此 Azure DevOps 服务器的身份验证,因为我能够安装来自此服务器的 Nuget 包。
这是我的调试设置:
非常感谢。我真的想不通这个拼图少了什么
好吧,我应该在发布问题之前阅读并遵循 ,因为这是拼图缺失的部分。
我需要按照 Eric's blog post 的第 5 步和第 6 步进行操作,但实际上我不需要修改我的 pack
命令,因为我没有将 .pdb
文件包含在Nuget 包。
[编辑 2]:
注意:到目前为止,如果使用 调试构建配置 生成 Nuget 包,我只能让它工作。如果您找到一种方法来获取源代码 Link 并在 Nuget 包中使用发布 DLL,请回答 my other question。谢谢
[编辑]:因为我为我的公司写了一份文档,这里是:
总结:
这需要两件事:
- 可以访问项目(
.pdb
)的符号文件,这是调试器使用的映射文件
- 启用源代码 Link 支持以便 Visual Studio 知道在调试时应该从哪里下载源代码
设置:
组件的项目
对于您解决方案中的每个项目:
仅当您计划 Nuget 包的消费者使用 Visual Studio 2017 时。如果您想要使用 Source Link,则不需要此步骤Visual Studio 2019:
在 Visual Studio 中,右键单击您的项目 -> Properties
然后转到 Build -> Advanced
并将 Debugging Information
从 Portable
(默认值)更改为至 Full
安装 Microsoft.SourceLink.AzureDevOpsServer.Git Nuget 包
编辑 .csproj
文件并在第一个 PropertyGroup
元素中包含以下代码:
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<EmbedUntrackedSources>true</EmbedUntrackedSources>
Azure DevOps 构建管道
创建一个名为 BuildConfiguration
的管道变量(如果它不存在)并将值设置为 Debug
- 在您的
.NET Core Build
任务中使用此变量作为参数:--configuration $(BuildConfiguration)
- 在您的
.NET Core Pack
任务中,在 Configuration to Package
字段中使用此变量:$(BuildConfiguration)
在你的管道结束时你必须有一个任务Index Sources & Publish Symbols
- 在
Artifact name
字段中,也必须使用BuildConfiguration
变量:Symbols_$(BuildConfiguration)
当然你还必须有一个 .NET Core Push
任务来将你的 Nuget 包推送到你的 Azure DevOps Nuget Feed
Visual Studio
Tools -> Options -> Debugging -> Symbols
单击 New Azure DevOps Symbol Server Location...
按钮并向服务器进行身份验证
- 将缓存文件夹设置到方便的位置,例如
C:\Symbols\
。这是您所有 .pdb
文件将存储的地方
Tools -> Options -> Debugging -> Symbols
点击 Load only specified modules
。您可以在这里指定要加载的DLL的符号文件。
如果您不这样做并将默认设置保留为 Load all modules, unless excluded
,当您 运行 您的程序处于调试模式时,Visual Studio 将花费很长时间来加载所有内容。
提示: 要查看项目加载的所有 DLL,请在调试时单击 Debug -> Windows -> Modules
。从这里您可以查看完整列表,select 多个然后右键单击 Copy Value -> Copy Name
Tools -> Options -> Debugging -> General
- 取消选中
Enable Just My Code
- 勾选
Enable source server support
- 勾选
Enable Source Link Support
正在使用项目
当您想在 Nuget 包的代码中调试时,自然地按 F11
进入它,Visual Studio 将询问您是否同意从您的 Azure DevOps 存储库下载源代码
互联网上有几种关于如何使用 Symbols 源文件和 Source Link 在 Nuget 包中进行调试的方法,但老实说,我很难理解什么是好的方法。
我们有一个 Azure DevOps 服务器,我们在其上生成 Nuget 包,同时使用构建管道中的 Index Sources & Publish Symbols
任务将 .pdb
文件发布到 Azure DevOps 符号服务器 described here
我的项目'也引用了 Microsoft.SourceLink.Vsts.Git
和 .csproj
文件中的这段代码
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<EmbedUntrackedSources>true</EmbedUntrackedSources>
我已经阅读了几篇博文,但我最信任的最新消息来源当然是官方 Source Link Git repository。
readme.md
文件说
Including PDBs in the .nupkg is generally no longer recommended as it increases the size of the package and thus restore time for projects that consume your package, regardless of whether the user needs to debug through the source code of your library or not
我同意这一点,这就是为什么我要使用符号服务器,而不是将 .pdb
文件包含在 Nuget 包中。因此,请不要将我的问题标记为
自述文件还指出
.snupkg symbol packages have some limitations:
- They do not currently support Windows PDBs (generated by VC++, or for managed projects that set build property DebugType to full)
- They require the library to be built by newer C#/VB compiler (Visual Studio 2017 Update 9).
- The consumer of the package also needs Visual Studio 2017 Update 9 debugger.
- Not supported by Azure DevOps Artifacts service.
所以至少我知道我不能使用它。
但是设置 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
给出的URL,我可以看到最新的源代码。但是现在问题来了,为什么Visual Studio下载不到源码呢?我在 VS 中通过了此 Azure DevOps 服务器的身份验证,因为我能够安装来自此服务器的 Nuget 包。
这是我的调试设置:
非常感谢。我真的想不通这个拼图少了什么
好吧,我应该在发布问题之前阅读并遵循
我需要按照 Eric's blog post 的第 5 步和第 6 步进行操作,但实际上我不需要修改我的 pack
命令,因为我没有将 .pdb
文件包含在Nuget 包。
[编辑 2]:
注意:到目前为止,如果使用 调试构建配置 生成 Nuget 包,我只能让它工作。如果您找到一种方法来获取源代码 Link 并在 Nuget 包中使用发布 DLL,请回答 my other question。谢谢
[编辑]:因为我为我的公司写了一份文档,这里是:
总结:
这需要两件事:
- 可以访问项目(
.pdb
)的符号文件,这是调试器使用的映射文件 - 启用源代码 Link 支持以便 Visual Studio 知道在调试时应该从哪里下载源代码
设置:
组件的项目
对于您解决方案中的每个项目:
仅当您计划 Nuget 包的消费者使用 Visual Studio 2017 时。如果您想要使用 Source Link,则不需要此步骤Visual Studio 2019:
在 Visual Studio 中,右键单击您的项目 ->
Properties
然后转到Build -> Advanced
并将Debugging Information
从Portable
(默认值)更改为至Full
安装 Microsoft.SourceLink.AzureDevOpsServer.Git Nuget 包
编辑
.csproj
文件并在第一个PropertyGroup
元素中包含以下代码:
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<EmbedUntrackedSources>true</EmbedUntrackedSources>
Azure DevOps 构建管道
创建一个名为
BuildConfiguration
的管道变量(如果它不存在)并将值设置为Debug
- 在您的
.NET Core Build
任务中使用此变量作为参数:--configuration $(BuildConfiguration)
- 在您的
.NET Core Pack
任务中,在Configuration to Package
字段中使用此变量:$(BuildConfiguration)
- 在您的
在你的管道结束时你必须有一个任务
Index Sources & Publish Symbols
- 在
Artifact name
字段中,也必须使用BuildConfiguration
变量:Symbols_$(BuildConfiguration)
- 在
当然你还必须有一个
.NET Core Push
任务来将你的 Nuget 包推送到你的 Azure DevOps Nuget Feed
Visual Studio
Tools -> Options -> Debugging -> Symbols
单击New Azure DevOps Symbol Server Location...
按钮并向服务器进行身份验证- 将缓存文件夹设置到方便的位置,例如
C:\Symbols\
。这是您所有.pdb
文件将存储的地方
- 将缓存文件夹设置到方便的位置,例如
Tools -> Options -> Debugging -> Symbols
点击Load only specified modules
。您可以在这里指定要加载的DLL的符号文件。如果您不这样做并将默认设置保留为
Load all modules, unless excluded
,当您 运行 您的程序处于调试模式时,Visual Studio 将花费很长时间来加载所有内容。提示: 要查看项目加载的所有 DLL,请在调试时单击
Debug -> Windows -> Modules
。从这里您可以查看完整列表,select 多个然后右键单击Copy Value -> Copy Name
Tools -> Options -> Debugging -> General
- 取消选中
Enable Just My Code
- 勾选
Enable source server support
- 勾选
Enable Source Link Support
- 取消选中
正在使用项目
当您想在 Nuget 包的代码中调试时,自然地按 F11
进入它,Visual Studio 将询问您是否同意从您的 Azure DevOps 存储库下载源代码