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

1hdlvixo  于 2023-04-22  发布在  其他
关注(0)|答案(7)|浏览(246)

我正在使用MSBuild生成我的nuget包。
是否需要设置任何命令,以允许它包含我的.pdb文件,以便在调试时单步执行源代码?
我不希望将源文件包含到正在拉入nuget包的项目中。

nnt7mjpx

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>
nnt7mjpx

nnt7mjpx2#

虽然它可能对调试没有帮助,但包含.pdb文件肯定很有用,这样堆栈跟踪就有了行号。
在nuspec文件中,包含一个<files>元素(<package>的子元素,<metadata>的兄弟元素)。这是我的一个类库中的内容:

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

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

e5njpo68

e5njpo683#

使用.csproj格式的.NET Core NuGet创建要容易得多,因为MSBuild完成了大部分工作。
为了包含您的pdb文件,您只需在项目的.csproj文件的PropertyGroup中输入标记<IncludeSymbols>true</IncludeSymbols>
这将创建一个额外的.symbols.nupkg包,您可以将其发布到[debug]提要。

  • 旧的.NET framework文件可以通过开源库轻松Map到新的csproj,如hvanbakel's repo*
js5cn81o

js5cn81o4#

这也可以通过dotnet CLI来实现。
通过 Package 与

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

我得到了我生成的包的完整调试

x0fgdtte

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,以改善发布配置中的调试体验。

njthzxwz

njthzxwz6#

参考this link。实际上你应该在命令的末尾添加 -Symbols 来创建一个符号包。你不应该在主nuget包中添加pdb文件。

zour9fqk

zour9fqk7#

较新的方法是使用以下.csproj属性:

<DebugType>embedded</DebugType>
<EmbedAllSources>true</EmbedAllSources>

EmbedAllSources -将在PDB中包含源代码,以便于调试。
将DebugType设置为embedded将导致PDB嵌入到. DLL中。
因此,同时使用这两个选项,源代码将嵌入到DLL中。

相关问题