使用Azure DevOps和源链接调试NuGet包

9

我正在尝试让SourceLink与私有NuGet包配合使用。我的netcore2.1 Web应用程序引用了我们Azure Devops NuGet feed上托管的netstandard2.0 NuGet包。

问题1: Source Link是否支持.NET Standard包?

我按照这里的指南https://learn.microsoft.com/en-us/azure/devops/artifacts/symbols/setting-up-github-sourcelinking?view=vsts进行操作,步骤如下:

  1. 将索引源和发布符号包添加到我的Azure Devops构建中。

  2. 在Visual Studio中,将我们的VSTS服务器添加为符号服务器。

  3. 在Visual Studio中启用Source Link支持。我还尝试启用了Source server支持。

构建管道发布符号路径似乎正在工作-在日志中我看到:

Succeeded processing D:\a\1\s\src\MyCompany.Core.Services.SnapshotClient\bin\release\netstandard2.0\MyCompany.Core.Services.SnapshotClient.pdb:

当我开始调试我的应用程序时,在VS输出窗口中会看到一堆输出:

'dotnet.exe' (CoreCLR: clrhost): Loaded 'C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App\2.1.4\Microsoft.AspNetCore.Hosting.dll'. Cannot find or open the PDB file.

对于我的NuGet包,我看到“Symbols loaded”,这似乎是有希望的。

顺便说一下,我没有看到来自Visual Studio的提示“Source Link将从互联网下载”。

当我调试并尝试步入我的NuGet包时,它只是跳过了它。

然后我尝试了:

  1. 转到https://github.com/dotnet/sourcelink并按照他们的说明安装了Microsoft.SourceLink.Vsts.Git包(问题2:这是必需的吗?)

  2. 当这不起作用时,我升级了我的应用程序中的每个软件包,这迫使我安装.NET Core SDK 2.1.403

  3. 在GitHub问题上搜索后,尝试向我的NuGet包的.csproj添加一些内容: <PublishRepositoryUrl>true</PublishRepositoryUrl> <AllowedOutputExtensionsInPackageBuildOutputFolder>$(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb</AllowedOutputExtensionsInPackageBuildOutputFolder> <DebugType>portable</DebugType> <ci>true</ci> 现在我的.nupkg也包含.pdb文件,之前没有。但仍然无法进行调试。

  4. https://www.nuget.org/packages/sourcelink/安装了sourcelink cli工具,并在我的.nupkg的.pdb上运行sourcelink print-urls。URL似乎正确?

  5. 看到@mitchdenny的评论https://github.com/MicrosoftDocs/vsts-docs/issues/1336#issuecomment-414415049后禁用索引。仍然无效。

现在我迷惑不解为什么它不起作用。

2个回答

14

我写了一篇完整的博客,介绍如何使用 .NET Core 和 AzureDevops 调试 Nuget 包,但这些步骤同样适用于 .NET Standard 项目。

话虽如此,微软文档中缺少的一些关键点需要注意:

  • 项目的调试信息需要从“Portable”更改为“Full”
  • AzureDevOps Nuget(restore、build、pack和push)需要使用 .NET Core 任务。
  • .NET Core build 任务应该有一个参数 "--configuration",传入值 "debug"。这样会生成 .PDB 文件
  • .NET Core pack 任务应该使用“custom”命令,并将自定义命令设置为“pack”,并具有以下参数:"--include-symbols -v d" 和 "-c"传入值 "debug"。这样做告诉打包命令将 .PDB 文件包含在包中。

感谢Eric。当时我花了至少一天的时间来尝试解决这个问题,并尝试了其中的几个选项。我已经离开了那份工作,但如果我再次尝试,我会参考你的博客。 - Matt Frear
1
哇,我在发布我的问题到SO之前应该读一下这个答案。现在应该接受这个答案,因为在Nuget包中包含.pdb文件不再被推荐。 - Jérôme MEVEL
7
@Eric,你的网站证书无效。你可能希望检查一下。 - Guillaume

4

问题1:Source Link是否支持.NET Standard包?

是的。我成功地在Azure DevOps Pipeline上构建了一个.NET Standard 2.0库,然后将其推送到我们的私有Azure DevOps Artifacts NuGet源中。接着,在本地项目中,我能够进入该库(Visual Studio弹出一个关于下载远程源代码的弹窗提示)。

这是我必须在库的.csproj文件中进行的更改:

<PropertyGroup>
  <PublishRepositoryUrl>true</PublishRepositoryUrl>
  <EmbedUntrackedSources>true</EmbedUntrackedSources>
  <AllowedOutputExtensionsInPackageBuildOutputFolder>
    $(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb
  </AllowedOutputExtensionsInPackageBuildOutputFolder>
</PropertyGroup>
...
<ItemGroup>
  <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0-beta-63127-02" PrivateAssets="All"/>
</ItemGroup>

第二个问题:[对于Microsoft.SourceLink.GitHub的PackageReference]是必需的吗?

我不确定。文档建议需要。但我删除了引用,在Azure DevOps上重新构建后,仍然可以调试该库。也许在不同的环境中它是必需的(为了保险起见,我仍然保留它)。

FWIW:

  • 我使用Visual Studio 15.8.9进行调试
  • 我最新安装的.NET Core SDK是2.1.403
  • 我的库的用户是一个.NET Core 2.1可执行文件
  • 我使用Cake编译我的库,并调用dotnet msbuild

我尝试了一下,我在包元数据中得到了链接,但它仍然不起作用。我发现我的包中没有任何pub文件,只有一个单独的dll。你能告诉我们你的包内容是什么吗? 我还在使用cake的Nuget Package任务。有特殊的设置吗?你能提供更多关于构建的信息吗? - fra
我在VS中有相同的设置。我从未收到下载提示,但在调试窗口中,我可以看到无法找到pdb文件的错误消息。 - fra
你在使用 Azure DevOps 的私有 NuGet feed 进行身份验证时有做过什么特殊的处理吗? - fra
不,我使用一个简单的命令行设置了对我的源的访问权限:nuget sources add -name MyFeed -source http://pkgs.dev.azure.com/myfeed/index.json -username anyusername -password mypersonalaccesstoken123 - dillonius01
1
那听起来真的很令人沮丧,但很高兴你最终找到了根本问题! - dillonius01
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接