使用 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 知道在调试时应该从哪里下载源代码

设置:

组件的项目

对于您解决方案中的每个项目:

  1. 仅当您计划 Nuget 包的消费者使用 Visual Studio 2017 时。如果您想要使用 Source Link,则不需要此步骤Visual Studio 2019:

    在 Visual Studio 中,右键单击您的项目 -> Properties 然后转到 Build -> Advanced 并将 Debugging InformationPortable (默认值)更改为至 Full

  2. 安装 Microsoft.SourceLink.AzureDevOpsServer.Git Nuget 包

  3. 编辑 .csproj 文件并在第一个 PropertyGroup 元素中包含以下代码:

 <PublishRepositoryUrl>true</PublishRepositoryUrl>
 <EmbedUntrackedSources>true</EmbedUntrackedSources>

Azure DevOps 构建管道

  1. 创建一个名为 BuildConfiguration 的管道变量(如果它不存在)并将值设置为 Debug

    • 在您的 .NET Core Build 任务中使用此变量作为参数:--configuration $(BuildConfiguration)
    • 在您的 .NET Core Pack 任务中,在 Configuration to Package 字段中使用此变量:$(BuildConfiguration)
  2. 在你的管道结束时你必须有一个任务Index Sources & Publish Symbols

    • Artifact name字段中,也必须使用BuildConfiguration变量:Symbols_$(BuildConfiguration)
  3. 当然你还必须有一个 .NET Core Push 任务来将你的 Nuget 包推送到你的 Azure DevOps Nuget Feed

Visual Studio

  1. Tools -> Options -> Debugging -> Symbols 单击 New Azure DevOps Symbol Server Location... 按钮并向服务器进行身份验证
    • 将缓存文件夹设置到方便的位置,例如 C:\Symbols\。这是您所有 .pdb 文件将存储的地方

  1. 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

  1. Tools -> Options -> Debugging -> General
    • 取消选中 Enable Just My Code
    • 勾选Enable source server support
    • 勾选Enable Source Link Support

正在使用项目

当您想在 Nuget 包的代码中调试时,自然地按 F11 进入它,Visual Studio 将询问您是否同意从您的 Azure DevOps 存储库下载源代码