将 pdb 文件包含到我的 nuget (nupkg) 文件中

Posted

技术标签:

【中文标题】将 pdb 文件包含到我的 nuget (nupkg) 文件中【英文标题】:Include pdb files into my nuget (nupkg) files 【发布时间】:2017-06-02 11:50:42 【问题描述】:

我正在使用 MSBuild 生成我的 nuget 包。

我是否需要设置任何命令,以允许它包含我的.pdb 文件,以便在调试时进入源代码?

我不希望将源文件包含在拉入 nuget 包的项目中。

【问题讨论】:

【参考方案1】:

如果您使用的是 VS2017 15.4 或更高版本,您可以在项目文件中定义一个 MSBuild 属性

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

这在NuGet #4142中讨论

但是,仍然存在一个问题,因为新项目系统不会将 pdb 从包中复制到 .NET Core 3.0+ 的 bin/publish 文件夹中,sourcelink/#628 也有一个很好的总结

目前计划在.NET 6 之前修复此问题:-(

【讨论】:

当我需要再次执行此操作时很有用,同时使用 Visual Studio 2017。感谢您的输入 我的主要 PropertyGroup 中有一个完整的示例,请查看 github.com/phatcher/CsvReader 对于我的生活,我无法让它工作。我正在使用 VS 2017 15.5.6。没有 nuspec 文件和以下构建后事件 nuget pack $(ProjectPath) -Prop Configuration=$(ConfigurationName) @kraeg 这是用于新的 Pack MSBuild 目标;我不能 100% 确定各种工具在此过程中如何相互使用,但可能需要您使用“msbuild /t:Pack”或右键单击项目并选择“创建 NuGet 包”-不再需要旧式的构建后事件。 @IGx89 github.com/dotnet/sdk/issues/1458#issuecomment-695119194【参考方案2】:

虽然它可能对调试没有帮助,但包含 .pdb 文件绝对有用,以便堆栈跟踪具有行号。

在 nuspec 文件中,包含一个 &lt;files&gt; 元素(&lt;package&gt; 的子元素,&lt;metadata&gt; 的兄弟元素)。这是我的一个类库中的内容:

<files>
    <file src="bin\$configuration$\$id$.pdb" target="lib\net452\" />
</files>

确保目标与您的 .dll 文件放在包中的文件夹相同。

【讨论】:

如果您还希望将它们包含在 NuGet 包中,请确保为您的 *.dll 文件添加 file 元素。 根据我的经验,.dll 文件已经包含在内 - 无需为它们添加文件元素。如果您有额外的 .dll 文件不是依赖项,那么您可能需要为这些文件添加文件元素。 由于我使用的是旧版本的 Visual Studio – Visual Studio 2012,可能排除了 *.dll 文件。但它们仍然被排除在外,直到我添加了 file 元素以明确包含它们。 @KennyEvitt,我建议您不要在 nuspec 中使用 *.dll。当您的输出不仅仅是您自己的 dll 时,您还将在您的包中嵌入所有其他 stuf,例如 log4net 或 entityframework。 @SvenL 谢谢。我无法再访问相关项目,但我很确定我只是明确地包含了我的项目的 DLL 文件,而且正如我所提到的,我使用的是旧版本的 Visual Studio,所以我的经验可能与其他人不匹配.【参考方案3】:

使用新的 csproj 格式,创建 NuGet 变得相当容易,因为 MSBuild 完成了大部分工作。

要包含您的pdb 文件,您只需输入标签

&lt;IncludeSymbols&gt;true&lt;/IncludeSymbols&gt;

在您要打包的项目的 csproj 文件的属性组中。 这将创建一个额外的 .symbols.nupkg 包,您可以将其发布到您的(调试)提要中。

【讨论】:

这对于本地调试来说无疑是一个简单的解决方案。我建议任何使用旧 .csproj 格式的人升级它以使用新格式。 有史以来最好的答案。 您从何处获得此信息?我无法在文档中找到它。也许我看错地方了。但我们将不胜感激,因此我可以阅读更多相关信息。 我真的不记得了。我认为 NuGet 开发团队 Github 中提到了这个问题。主要是通过反复试验发现它的工作原理。 这应该被标记为正确答案。它适用于 Visual Studio 2019。【参考方案4】:

这也可以通过 dotnet CLI 来完成。

通过包装用

dotnet pack --include-symbols --include-source [path-to-project-here]

我对生成的包进行了全面调试

【讨论】:

【参考方案5】:

对我有用的方法是将 PDB 添加为内容,这样可以将其与 DLL 一起复制。 (PackageCopyToOutput 是必需的)

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
    <GenerateDocumentationFile>true</GenerateDocumentationFile>
    <EmbedAllSources>true</EmbedAllSources>
  </PropertyGroup>

  <ItemGroup>
    <Content Include="bin\$(Configuration)\$(AssemblyName).pdb" PackagePath="contentFiles\any\netstandard2.0\$(AssemblyName).pdb">
       <PackageCopyToOutput>true</PackageCopyToOutput>
    </Content>
  </ItemGroup>
</Project>

EmbedAllSources - 将在 PDB 中包含源代码以便于调试。

您可能还需要考虑将“优化”设置为 false 以改善发布配置中的调试体验。

【讨论】:

它可能有效,但它使该文件夹成为项目的一部分【参考方案6】:

请参阅this link。实际上,您应该在命令末尾添加 -Symbols 以创建符号包。您不应该将 pdb 文件添加到主 nuget 包中。

【讨论】:

虽然这是事实、准确和更好的,而且确实是我采取的路线(起初)...我已经经历了符号服务器的许多小时问题,来自 microsoft starter package已弃用,对于仅提供 pdb 响应文件的压缩版本的 github SymbolServer,对于 Visual Studio 未在服务器列表中正确选择正确的符号服务器,我直接完成了符号服务器。就像许多其他软件包提供商所做的那样,只需将我的 .pdb 包含在 dll 旁边的 nuget 中,每次都可以完美地工作,而且不会大惊小怪。 "您不应该将 pdb 文件添加到主 nuget 包中。" - 为什么? 目前我不记得原因了,但似乎 nuget 本身做了必要的事情来添加相应的文件,明确告诉 nuget 添加 pdb 文件不会产生所需的结果。 @NeilBarnwell

以上是关于将 pdb 文件包含到我的 nuget (nupkg) 文件中的主要内容,如果未能解决你的问题,请参考以下文章

如何将二进制文件从 nuget 包复制到我的输出文件夹?

如何获取 EntityFramework NuGet 包的 PDB 文件?

如何从源代码管理中排除 NuGet 内容

pdb 文件包含多少信息? (C#/.NET)

如何调试从 TeamCity 部署的我的 nuget 包?

为啥我的 Service Fabric 代码会锁定自己的 PDB?