3

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

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

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

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

4

2 回答 2

7

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

首先:

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

第二:

  • 如果您想将自己的包的符号发布到公共提要(例如 nuget.org)上,那么 AFAIK.snupkg格式可以正常工作
  • 在私有 NuGet 提要(无论是使用本地文件系统 NuGet 提要还是 IISNuGet.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 文件,或者应该是......但目前.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>

和(从这里):

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

于 2020-01-20T17:09:33.920 回答
1

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

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

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

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

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

于 2020-01-22T15:02:57.347 回答