我正在使用MSBuild生成我的nuget包。是否需要设置任何命令,以允许它包含我的.pdb文件,以便在调试时单步执行源代码?我不希望将源文件包含到正在拉入nuget包的项目中。
.pdb
nnt7mjpx1#
如果您使用的是VS 2017 15.4或更高版本,则可以在项目文件中定义MSBuild属性
<AllowedOutputExtensionsInPackageBuildOutputFolder>$(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb</AllowedOutputExtensionsInPackageBuildOutputFolder>
这在NuGet #4142中讨论但是,仍然存在一个问题,因为新的项目系统不会将pdb从包复制到.NET Core 3.0+的bin/publish文件夹中,sourcelink/#628中也有一个很好的总结。目前还没有计划修复,直到.NET 7:-(与此同时,一个解决方案是将以下片段包含到API和测试项目中,以确保您拥有适当的pdbs,从而允许您单步执行远程源代码。
<!-- https://github.com/dotnet/sdk/issues/1458#issuecomment-1063915490 --> <Target Name="IncludeSymbolFiles" AfterTargets="ResolveAssemblyReferences" Condition="@(ReferenceCopyLocalPaths) != ''"> <ItemGroup> <ReferenceCopyLocalPaths Include="%(ReferenceCopyLocalPaths.RelativeDir)%(ReferenceCopyLocalPaths.Filename).pdb; %(ReferenceCopyLocalPaths.RelativeDir)%(ReferenceCopyLocalPaths.Filename).xml" /> <ReferenceCopyLocalPaths Remove="@(ReferenceCopyLocalPaths)" Condition="!Exists('%(FullPath)')" /> </ItemGroup> </Target>
nnt7mjpx2#
虽然它可能对调试没有帮助,但包含.pdb文件肯定很有用,这样堆栈跟踪就有了行号。在nuspec文件中,包含一个<files>元素(<package>的子元素,<metadata>的兄弟元素)。这是我的一个类库中的内容:
<files>
<package>
<metadata>
<files> <file src="bin\$configuration$\$id$.pdb" target="lib\net452\" /> </files>
确保目标文件夹与.dll文件放在包中的文件夹相同。
e5njpo683#
使用.csproj格式的.NET Core NuGet创建要容易得多,因为MSBuild完成了大部分工作。为了包含您的pdb文件,您只需在项目的.csproj文件的PropertyGroup中输入标记<IncludeSymbols>true</IncludeSymbols>。这将创建一个额外的.symbols.nupkg包,您可以将其发布到[debug]提要。
pdb
<IncludeSymbols>true</IncludeSymbols>
.symbols.nupkg
js5cn81o4#
这也可以通过dotnet CLI来实现。通过 Package 与
dotnet pack --include-symbols --include-source [path-to-project-here]
我得到了我生成的包的完整调试
x0fgdtte5#
对我有效的方法是将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中包含源代码,以便于调试。您可能还需要考虑将“Optimize”设置为false,以改善发布配置中的调试体验。
njthzxwz6#
参考this link。实际上你应该在命令的末尾添加 -Symbols 来创建一个符号包。你不应该在主nuget包中添加pdb文件。
zour9fqk7#
较新的方法是使用以下.csproj属性:
<DebugType>embedded</DebugType> <EmbedAllSources>true</EmbedAllSources>
EmbedAllSources -将在PDB中包含源代码,以便于调试。将DebugType设置为embedded将导致PDB嵌入到. DLL中。因此,同时使用这两个选项,源代码将嵌入到DLL中。
7条答案
按热度按时间nnt7mjpx1#
如果您使用的是VS 2017 15.4或更高版本,则可以在项目文件中定义MSBuild属性
这在NuGet #4142中讨论
但是,仍然存在一个问题,因为新的项目系统不会将pdb从包复制到.NET Core 3.0+的bin/publish文件夹中,sourcelink/#628中也有一个很好的总结。
目前还没有计划修复,直到.NET 7:-(
与此同时,一个解决方案是将以下片段包含到API和测试项目中,以确保您拥有适当的pdbs,从而允许您单步执行远程源代码。
nnt7mjpx2#
虽然它可能对调试没有帮助,但包含.pdb文件肯定很有用,这样堆栈跟踪就有了行号。
在nuspec文件中,包含一个
<files>
元素(<package>
的子元素,<metadata>
的兄弟元素)。这是我的一个类库中的内容:确保目标文件夹与.dll文件放在包中的文件夹相同。
e5njpo683#
使用.csproj格式的.NET Core NuGet创建要容易得多,因为MSBuild完成了大部分工作。
为了包含您的
pdb
文件,您只需在项目的.csproj文件的PropertyGroup中输入标记<IncludeSymbols>true</IncludeSymbols>
。这将创建一个额外的
.symbols.nupkg
包,您可以将其发布到[debug]提要。js5cn81o4#
这也可以通过dotnet CLI来实现。
通过 Package 与
我得到了我生成的包的完整调试
x0fgdtte5#
对我有效的方法是将PDB作为内容添加,这样做的好处是它将与DLL一起复制。(需要PackageCopyToOutput)
EmbedAllSources -将在PDB中包含源代码,以便于调试。
您可能还需要考虑将“Optimize”设置为false,以改善发布配置中的调试体验。
njthzxwz6#
参考this link。实际上你应该在命令的末尾添加 -Symbols 来创建一个符号包。你不应该在主nuget包中添加pdb文件。
zour9fqk7#
较新的方法是使用以下.csproj属性:
EmbedAllSources -将在PDB中包含源代码,以便于调试。
将DebugType设置为embedded将导致PDB嵌入到. DLL中。
因此,同时使用这两个选项,源代码将嵌入到DLL中。