将 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 文件中,包含一个 <files>
元素(<package>
的子元素,<metadata>
的兄弟元素)。这是我的一个类库中的内容:
<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
文件,您只需输入标签
<IncludeSymbols>true</IncludeSymbols>
在您要打包的项目的 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) 文件中的主要内容,如果未能解决你的问题,请参考以下文章