与Azure DevOps符号服务器的源链接

Jér*_*VEL 8 debug-symbols visual-studio nuget-package sourcelink azure-devops

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

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

我的项目中也有Microsoft.SourceLink.Vsts.Git对此.csproj文件的引用和此代码

<PublishRepositoryUrl>true</PublishRepositoryUrl>
<EmbedUntrackedSources>true</EmbedUntrackedSources>
Run Code Online (Sandbox Code Playgroud)

我看过几篇博客文章,但是我最信任的最新资源当然是官方的Source Link Git仓库

readme.md文件说

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

我同意这一点,这就是为什么我要使用Symbol Server而不.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 Package实际上是连接一些字符串,所以它介入了)

我试着跑步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调试设置

非常感谢。我真的不知道这个难题的缺失部分是什么

Jér*_*VEL 9

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

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

[编辑2]:

注意:到目前为止,只有在使用“ 调试构建配置”生成Nuget软件包的情况下,我才能使此工作正常。如果您找到让Nulink包中的Release DLL使用Source Link的方法,请回答我的其他问题。谢谢

[编辑]:由于我为公司编写了文档,因此这里是:

摘要:

这需要两件事:

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

设定:

组件的项目

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

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

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

    高级构建设置

  2. 安装Microsoft.SourceLink.Vsts.Git Nuget程序包(您必须选中Include prereleaseVisual Studio中的复选框)

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

 <PublishRepositoryUrl>true</PublishRepositoryUrl>
 <EmbedUntrackedSources>true</EmbedUntrackedSources>
Run Code Online (Sandbox Code Playgroud)

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存储库中下载源代码

消耗项目

  • *注意*:到目前为止,如果 Nuget 包是使用 **Debug Build Configuration** 生成的,我只能让它工作。如果您找到一种方法让 Source Link 与 Nuget 包中的 Release DLL 一起工作,请回答 [我的其他问题](/sf/ask/3912931641/ -not-working-when-nuget-package-genera)。谢谢 (2认同)