将项目引用的 PDB 文件包含在 nuget 包中



我正在尝试使用 dotnet pack 命令将项目引用的 PDB 文件包含在 Nuget 包中。

我找到了将项目引用的 DLL 文件包含在 nuget 包中的解决方案。这需要向 .csproj 文件添加一些代码。我也试图让它适用于.pdb文件,但这不起作用。

此代码仅将 *.dll 个文件复制到 nuget。

<Target Name="CopyProjectReferencesToPackage" DependsOnTargets="ResolveReferences">
  <ItemGroup>
    <BuildOutputInPackage Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference'))"/>
  </ItemGroup>
</Target>

这是我尝试过的,但是 *.pdb 文件在 nuget 中不可见。

<Target Name="CopyProjectReferencesToPackage" DependsOnTargets="ResolveReferences">
  <ItemGroup>
    <BuildOutputInPackage Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference')->Replace('.dll', '.pdb'))"/>
  </ItemGroup>
</Target>

溶液

我已经资助了复制引用的 PDB 的解决方案 - 只需将此行添加到您的 .csproj 文件中:

<Target Name="CopyPdbToPackage" Inputs="@(ReferenceCopyLocalPaths-&gt;WithMetadataValue('ReferenceSourceTarget', 'ProjectReference'))" Outputs="%(ProjectReference.Identity)" AfterTargets="CopyProjectReferencesToPackage">
    <PropertyGroup>
        <CurrentReference>%(ProjectReference.Identity)</CurrentReference>
        <CurrentReferenceName>$([System.IO.Path]::GetFileNameWithoutExtension($(CurrentReference)))</CurrentReferenceName>
    </PropertyGroup>
    <Message Text="Copying PDB of $(CurrentReferenceName) to packages..." Importance="high" Condition="'%(ProjectReference.NugetIgnore)'!='true'" />
    <ItemGroup>
        <AllItems Include="@(ReferenceCopyLocalPaths-&gt;WithMetadataValue('OriginalProjectReferenceItemSpec', '$(CurrentReference)'))" />
        <PdbFiles Include="%(AllItems.Identity)" Condition="@(AllItems-&gt;EndsWith('.pdb'))=='true'" />
    </ItemGroup>
    <ItemGroup>
        <TfmSpecificPackageFile Include="@(PdbFiles)" Condition="'%(ProjectReference.NugetIgnore)'!='true'">
            <PackagePath>lib/$(TargetFramework)</PackagePath>
        </TfmSpecificPackageFile>
    </ItemGroup>
</Target>

但是有一个问题,"主"nuget 项目的 PDB 没有被复制......

下面的配置实际上是对将 DLL 路径转换为 PDB 路径的最初想法的修复。PDB 文件未出现在生成的 nuget 包中的原因是输出文件在以后会进一步过滤(请参阅AllowedOutputExtensionsInPackageBuildOutputFolder)。幸运的是,我们可以自定义应保留的扩展。

请参阅下面的最终配置。它生成一个包,其中包含编译项目的 DLL/PDB 以及引用项目的 DLL/PDB。

<PropertyGroup>
  <!--Include Project References output-->
  <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
  <!--Allow certain extensions-->
  <AllowedOutputExtensionsInPackageBuildOutputFolder>$(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb</AllowedOutputExtensionsInPackageBuildOutputFolder>
</PropertyGroup>
<Target DependsOnTargets="ResolveReferences" Name="CopyProjectReferencesToPackage">
  <ItemGroup>
    <!--Include DLLs of Project References-->
    <BuildOutputInPackage Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference'))"/>
    <!--Include PDBs of Project References-->
    <BuildOutputInPackage Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference')->Replace('.dll', '.pdb'))"/>
  </ItemGroup>
</Target>
<</div> div class="one_answers">

您可以强制命令包含符号。

--include-symbols

最终命令,例如:

dotnet pack -c Debug --include-symbols

这包括包中的 *.pdb 文件。您可以在此处阅读有关包含符号的更多信息

编辑:我的答案不符合问题要求。请阅读此消息的评论。

最新更新