使用Azure Pipelines构建NuGet包时能否添加pdb文件随包分发?
完全可以将PDB文件添加到NuGet包中随包分发,你提到的栈跟踪带行号、直接调试库代码两个需求都可以通过如下配置实现。
csproj 配置调整
你现有的配置已经开启了完整调试信息生成,只需要在原有<PropertyGroup>节点中添加2项配置即可将PDB打包到nupkg文件内:
<PropertyGroup> <TargetFramework>net5.0</TargetFramework> <DebugType>full</DebugType> <GeneratePackageOnBuild>true</GeneratePackageOnBuild> <Version>5.0.4</Version> <!-- 新增以下两项配置 --> <AllowedOutputExtensionsInPackageBuildOutputFolder>$(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb</AllowedOutputExtensionsInPackageBuildOutputFolder> <EmbedUntrackedSources>true</EmbedUntrackedSources> </PropertyGroup>
配置说明:
- 第一项配置允许PDB文件被包含到NuGet包的构建输出目录中,打包后会和dll放在同一路径下
- 第二项配置可以把未被源码管理跟踪的生成代码也嵌入到调试信息里,避免调试时出现源码不匹配的问题
如果你更倾向于生成独立的符号包(snupkg)而非把PDB嵌入nupkg,可将上面两项新增配置替换为:
<IncludeSymbols>true</IncludeSymbols> <SymbolPackageFormat>snupkg</SymbolPackageFormat>
这种方式会在构建时同时生成nupkg和snupkg两个文件,需要把两个文件都上传到你的本地NuGet仓库即可生效。
Azure Pipelines YAML 调整
因为你已经使用了GeneratePackageOnBuild指令,构建步骤不需要额外修改,只需要在NuGet推送步骤确保对应的文件被推送即可:
- 如果你使用的是内嵌PDB到nupkg的方案,原有推送逻辑不需要修改,正常推送nupkg即可
- 如果你使用的是独立符号包方案,修改推送任务的匹配规则,同时推送nupkg和snupkg即可,示例任务配置:
- task: NuGetCommand@2 inputs: command: 'push' packagesToPush: '$(Build.ArtifactStagingDirectory)/**/*.nupkg;$(Build.ArtifactStagingDirectory)/**/*.snupkg' nuGetFeedType: 'internal' publishVstsFeed: '<你的本地NuGet仓库ID>' allowPackageConflicts: true
效果验证
打包完成后你可以把生成的nupkg文件后缀改为zip解压,查看lib/net5.0/目录下是否存在对应的pdb文件,存在即为配置生效。配置生效后:
- 引用该包的服务抛出异常时,栈跟踪会自动显示对应源码的准确行号
- VS等IDE开启源码调试选项后,可直接步进调试该库的代码,无需额外配置
内容的提问来源于stack exchange,提问作者Torben Nielsen
相关产品推荐
相关产品推荐

