18

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

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

我的项目'在文件中也有参考Microsoft.SourceLink.Vsts.Git和这段代码.csproj

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

我已经阅读了几篇博客文章,但我最相信最新的来源当然是官方的Source Link Git 存储库

文件readme.md

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

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

自述文件还指出

.snupkg 符号包有一些限制

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

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

但是,设置 Source Link 并开始工作的正确方法是什么?

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

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

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

这是我的调试设置:

VS调试设置

非常感谢。我真的无法弄清楚这个谜题中缺少的部分是什么

4

1 回答 1

25

好吧,在发布我的问题之前,我应该阅读并遵循这个答案,因为这是拼图中缺失的部分。

我需要遵循Eric 博客文章的第5 步和第 6 步,但实际上我不需要修改我的pack命令,因为我没有.pdb在 Nuget 包中包含该文件。

[编辑 2]:

注意:到目前为止,如果 Nuget 包是使用Debug Build Configuration生成的,我只能让它工作。如果您找到一种方法让 Source Link 与 Nuget 包中的 Release DLL 一起工作,请回答我的另一个问题。谢谢

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

概括:

这需要两件事:

  • 可以访问项目的符号文件 ( .pdb),这是调试器使用的映射文件
  • 启用源链接支持,以便 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

Azure DevOps 构建管道

视觉工作室

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

将符号服务器添加到 Visual Studio

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

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

    提示:要查看项目加载的所有 DLL,请在调试时单击Debug -> Windows -> Modules。从这里您可以查看完整列表,选择多个然后右键单击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 存储库下载源代码

消费项目

于 2019-03-04T10:07:56.963 回答