【问题标题】:Including project referenced PDB files into nuget package将项目引用的 PDB 文件包含到 nuget 包中
【发布时间】:2019-06-05 09:29:09
【问题描述】:

我正在尝试使用 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没有被复制...

【问题讨论】:

    标签: c# .net nuget package pdb-files


    【解决方案1】:

    下面的配置实际上是对您最初将 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>
    

    【讨论】:

      【解决方案2】:

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

      --include-symbols
      

      最终命令举例:

      dotnet pack -c Debug --include-symbols
      

      这包括您在包中的 *.pdb 文件。你可以阅读更多关于包含符号Here

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

      【讨论】:

      • 不,它会创建名为 *.symbols.nupkg 的新 nuget 包,并且此包不包含项目引用的 *.pdb 文件,而仅包含“父”项目 .pdb。你可以阅读更多关于包含符号Here
      • 明白。我会试着找到一些东西。
      • Here。此复制 DLL 的代码是开放功能问题的解决方法。我在问,是否有可能编辑此解决方法来复制 PDB?
      • 非常好的解决方法,但正如您所说,它不适合您,因为您想包含引用项目中的 *.pdb。很抱歉造成误解。 This comment 说明了一切。 :) 感谢您提供的信息。
      猜你喜欢
      • 1970-01-01
      • 2017-06-02
      • 1970-01-01
      • 1970-01-01
      • 2018-12-08
      • 1970-01-01
      • 1970-01-01
      • 2015-05-08
      • 1970-01-01
      相关资源
      最近更新 更多