【问题标题】:Enabling SourceLink启用 SourceLink
【发布时间】:2018-11-23 11:38:26
【问题描述】:

在 VSTS (Azure DevOps) 上拥有私有存储库我尝试通过将以下内容添加到 .csproj 文件来启用 SourceLink:https://github.com/dotnet/sourcelink#azure-devops-visual-studio-team-services

这在调试过程中似乎没有任何影响。本地 NuGet 包中引发异常,我无法使用调用堆栈窗口导航到它,因为甚至没有为该项目加载 pdb。

我在 Visual Studio 中禁用了“仅启用我的代码”并启用了 SourceLink。

我还需要进行哪些其他更改才能启用 SourceLink?

【问题讨论】:

  • 新的 csproj 格式不会将 PDB 从 nuget 包复制到输出目录,请自行执行此操作
  • @magicandre1981https://github.com/dotnet/sourcelink#using-sourcelink 似乎暗示有一种方法可以指定 PDB 生成
  • 你没有抓住重点。我谈论消费 nuget 包。这里是new SDK has a bug,它不会将 PDB 复制到输出,因此没有 PDB + sourcelink 信息。

标签: c# visual-studio sourcelink


【解决方案1】:

大多数关于如何设置 SourceLink 的教程似乎都忽略了两个关键内容。

首先:

  • 除了取消选中“仅启用我的代码”(非默认)并确保选中“选项/调试/常规”下的“启用源链接支持”(默认),
  • 如果您想使用 SourceLink 处理公共包(例如 Newtonsoft.Json),您还必须检查 VS Options/Debugging/Symbols 中列出的符号服务器。

其次:

  • 如果您想将自己的包的符号发布到公共供稿(例如 nuget.org)上,那么 AFAIK .snupkg 格式可以正常工作
  • 在私有 NuGet 源(无论是使用本地文件系统 NuGet 源还是 IIS NuGet.Server 包)上,没有符号服务器,不支持 .snupkg,并且这个(被广泛列为要做什么)相反)不起作用(它在 NuGet 包中包含 .pdb 文件,但根据我的测试,消费 VS 从不使用它们):
  <PropertyGroup>
    <AllowedOutputExtensionsInPackageBuildOutputFolder>$(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb</AllowedOutputExtensionsInPackageBuildOutputFolder>
  </PropertyGroup>
  • 在同一个地方改用它确实可以工作(pdb 嵌入在 dll 本身中,消费 VS 可以很好地看到它):
  <PropertyGroup>
    <DebugType>Embedded</DebugType>
  </PropertyGroup>

您绝对应该查看 Debug/Windows/Modules 下的 VS Modules 窗口(快捷键 CTRL+ALT+U)(仅在代码运行时可用),它显示了哪些模块已加载符号并帮助您找出哪个避风港'不,为什么不呢,如果他们没有。

编辑

事实证明:

  <PropertyGroup>
    <AllowedOutputExtensionsInPackageBuildOutputFolder>$(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb</AllowedOutputExtensionsInPackageBuildOutputFolder>
  </PropertyGroup>

正在工作。它会生成一个很好的 NuGet 文件,或者应该是......但当前有 a bug in .NET SDK 导致它不会以这种方式加载存储在 NuGet 文件中的 .pdb 文件,尽管它应该。

还有另一个修复。在消费项目中,包括:

    <PackageReference Include="SourceLink.Copy.PdbFiles" Version="2.8.3" PrivateAssets="All" />

添加之后,一切都应该按照演示再次运行。

或者,该软件包适用的修复是:

<Project>
  <Target Name="_ResolveCopyLocalNuGetPackagePdbs" AfterTargets="ResolveReferences"
      Condition="$(CopyLocalLockFileAssemblies) == true">
    <ItemGroup>
      <ReferenceCopyLocalPaths Include="@(ReferenceCopyLocalPaths->'%(RootDir)%(Directory)%(Filename).pdb')" 
          Condition="'%(ReferenceCopyLocalPaths.NuGetPackageId)' != '' and Exists('%(RootDir)%(Directory)%(Filename).pdb')" />
    </ItemGroup>
  </Target>
</Project>

和(来自here):

将它放在 Directory.Build.targets 中的好地方,这样您的项目文件就不会杂乱无章,这样您就可以将其应用于解决方案中的多个项目。 https://docs.microsoft.com/en-us/visualstudio/msbuild/customize-your-build

【讨论】:

    【解决方案2】:

    这可能不是一个直接的答案,但值得注意的是,您不需要 SourceLink 即可获得源代码级调试。 SourceLink 是一种巧妙的方法,可以将 PDB 中的链接放入 git 存储库中云中的源代码。

    获得可移植源代码级调试的另一种方法是将源代码直接嵌入 PDB (EmbedAllSources=True),然后将 PDB 嵌入 DLL (DebugType=embedded)。它相当高效(.nupkg 文件大 20-30%)并且不会受到当前影响单独 PDB 的 bug 的影响。

    只需将其添加到您的项目文件中:

      <PropertyGroup>
        <EmbedAllSources>True</EmbedAllSources>
        <DebugType>embedded</DebugType>
      </PropertyGroup>
    

    你瞧,你将能够单步进入从它生成的 NuGet 文件。不需要其他解决方法,也不需要 SourceLink 包。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-02
      相关资源
      最近更新 更多