【问题标题】:Source Link with an Azure DevOps Symbol Server与 Azure DevOps 符号服务器的源链接
【发布时间】:2019-07-25 14:19:11
【问题描述】:

互联网上有几种关于如何使用符号源文件和源链接在 Nuget 包中进行调试的记录方法,但老实说,我很难理解什么是好方法。

我们有一个 Azure DevOps 服务器,我们在其上生成 Nuget 包,同时在我们的构建管道中使用 Index Sources & Publish Symbols 任务作为 described here.pdb 文件发布到 Azure DevOps 符号服务器

我的项目'还引用了 Microsoft.SourceLink.Vsts.Git.csproj 文件中的此代码

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

我已经阅读了几篇博文,但我最信任的最新消息来源当然是官方Source Link Git repository

readme.md 文件说

通常不再建议在 .nupkg 中包含 PDB,因为它会增加包的大小,从而为使用您的包的项目恢复时间,无论用户是否需要通过库的源代码进行调试

我同意这一点,这就是我想使用符号服务器的原因,而不是在 Nuget 包中包含 .pdb 文件。因此,请不要将我的问题标记为与this one 重复,因为接受的答案正是我不想做的。

自述文件还指出

.snupkg 符号包有一些限制

  • 它们目前不支持 Windows PDB(由 VC++ 生成,或用于将构建属性 DebugType 设置为 full 的托管项目)
  • 它们要求库由较新的 C#/VB 编译器(Visual Studio 2017 Update 9)构建。
  • 软件包的使用者还需要 Visual Studio 2017 Update 9 调试器。
  • Azure DevOps Artifacts 服务不支持

所以至少我知道我不能使用它。

但是,设置 Source Link 并使其正常工作的正确方法是什么?

当我调试我的测试控制台应用程序时,它成功地将.pdb 文件下载到我的符号缓存文件夹中,但是如果我尝试使用F11 单步执行来自我的 Nuget 包的代码,它就不起作用。 (但是它会进入System.String.Concat,因为我的简单测试 Nuget 包实际上是在连接一些字符串)

我尝试运行sourcelink test TestSourceLink.pdb,但得到error: url hash does not match。我读到heresourcelink test 是一个遗留问题,不支持对像我们这样的私有存储库进行身份验证。

使用我的浏览器,如果我访问sourcelink print-json TestSourceLink.pdb 给出的URL,我可以看到最新的源代码。但现在的问题是,为什么 Visual Studio 无法下载源代码?我已通过 VS 中的此 Azure DevOps 服务器的身份验证,因为我能够安装来自此服务器的 Nuget 包。

这是我的调试设置:

非常感谢。我真的不知道这个谜题缺少什么

【问题讨论】:

  • 对于我的生活,我无法理解为什么 Azure DevOps(特别是 Azure Artifacts)不支持源链接。我的意思是 MS 构建了该链中的每个组件,但他们不支持自己的东西?

标签: visual-studio azure-devops nuget-package debug-symbols sourcelink


【解决方案1】:

好吧,我应该在发布我的问题之前阅读并关注this answer,因为这是拼图中缺失的部分。

我需要遵循Eric's blog post 的步骤 5 和 6,但实际上我不需要修改我的 pack 命令,因为我没有在 Nuget 包中包含 .pdb 文件。

[编辑 2]:

注意:到目前为止,只有在使用 Debug Build Configuration 生成 Nuget 包时,我才能使其正常工作。如果您找到了让源链接与 Nuget 包中的发布 DLL 一起工作的方法,请回答 my other question。谢谢

[编辑]:因为我为我的公司写了一个文档,这里是:

总结:

这需要两件事:

  • 可以访问项目的符号文件 (.pdb),这是调试器使用的映射文件
  • 启用源链接支持,以便 Visual Studio 知道在调试时应该从哪里下载源代码

设置:

组件的项目

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

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

    在 Visual Studio 中,右键单击您的项目 -> Properties 然后转到 Build -&gt; 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 &amp; Publish Symbols

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

视觉工作室

  1. Tools -&gt; Options -&gt; Debugging -&gt; Symbols 点击New Azure DevOps Symbol Server Location... 按钮并验证服务器
    • 将缓存文件夹设置到一个方便的位置,例如C:\Symbols\。这是您所有.pdb 文件的存储位置

  1. Tools -&gt; Options -&gt; Debugging -&gt; Symbols 点击Load only specified modules。您可以在此处指定要加载的 DLL 的符号文件。

    如果您不这样做并将默认设置为Load all modules, unless excluded,则当您在调试模式下运行程序时,Visual Studio 将需要很长时间才能加载所有内容。

    提示:要查看项目加载的所有 DLL,请在调试时单击 Debug -&gt; Windows -&gt; Modules。从这里您可以查看完整列表,选择多个然后右键单击Copy Value -&gt; Copy Name

  1. Tools -&gt; Options -&gt; Debugging -&gt; General
    • 取消选中Enable Just My Code
    • 检查Enable source server support
    • 检查Enable Source Link Support

消费项目

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

【讨论】:

  • 注意:到目前为止,我只能在使用 Debug Build Configuration 生成 Nuget 包的情况下完成这项工作。如果您找到一种方法让 Source Link 与 Nuget 包中的 Release DLL 一起工作,请回答 my other question。谢谢
猜你喜欢
  • 2021-08-01
  • 1970-01-01
  • 2021-02-18
  • 2019-09-11
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-18
相关资源
最近更新 更多