.NET SDK样式项目打包时如何将引用项目打进同一个包

此篇为上一篇[《.NET SDK样式项目打包时如何将项目引用转为包依赖》](https://www.cnblogs.com/cnsharp/p/18819771 ")的姊妹篇。

通常情况下,我们会将每个项目都生成一个包。但有时也可能一些特殊情况会将项目及其引用项目的相关文件都打进一个包。

在之前的.nuspec文件中,我们可以在<files>节点中声明。SDK样式的项目中要怎么做呢?

变通

在NuGet Github Issue中有一条评论是这样的,他给出一个workaround.

复制代码
<Project>
  <PropertyGroup>
    <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
  </PropertyGroup>
  
  <Target Name="CopyProjectReferencesToPackage" DependsOnTargets="BuildOnlySettings;ResolveReferences">
    <ItemGroup>
      <!-- Filter out unnecessary files -->
      <_ReferenceCopyLocalPaths Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference')->WithMetadataValue('PrivateAssets', 'All'))"/>
    </ItemGroup>

    <!-- Print batches for debug purposes -->
    <Message Text="Batch for .nupkg: ReferenceCopyLocalPaths = @(_ReferenceCopyLocalPaths), ReferenceCopyLocalPaths.DestinationSubDirectory = %(_ReferenceCopyLocalPaths.DestinationSubDirectory) Filename = %(_ReferenceCopyLocalPaths.Filename) Extension = %(_ReferenceCopyLocalPaths.Extension)" Importance="High" Condition="'@(_ReferenceCopyLocalPaths)' != ''" />

    <ItemGroup>
      <!-- Add file to package with consideration of sub folder. If empty, the root folder is chosen. -->
      <BuildOutputInPackage Include="@(_ReferenceCopyLocalPaths)" TargetPath="%(_ReferenceCopyLocalPaths.DestinationSubDirectory)"/>
    </ItemGroup>
  </Target>
</Project>

细看一下,它还打印了debug信息,如果想去掉可以简化为

复制代码
<Target Name="CopyProjectReferencesToPackage" DependsOnTargets="ResolveReferences"> 
    <ItemGroup> 
      <BuildOutputInPackage Include="@(ReferenceCopyLocalPaths-&gt;WithMetadataValue('ReferenceSourceTarget', 'ProjectReference')-&gt;WithMetadataValue('PrivateAssets', 'All'))" /> 
    </ItemGroup> 
</Target> 

它要求将引用项目设置为PrivateAssets="all"

或者直接通过VS的右键菜单设置属性,结果像下面这样

复制代码
<ProjectReference Include="..\Core\Core.csproj">
  <PrivateAssets>All</PrivateAssets>
</ProjectReference>

局限

假设有一组项目依赖关系如下:

LibraryA -----> Core ----> CoreOfCore

为了实现上述效果,我们需要在LibraryA项目中将Core/CoreOfCore都引用进来。如果依赖项更多,则项目的依赖关系将变得不清晰。

所以该方案的局限就是不太能支持级联。

回归

这样下来,还是.nuspec好用,可以灵活定义依赖项和文件。

因此,在我最新版的NuPack 17.1中,恢复了对.nuspec的支持,并增加了其在SDK style项目中的选项。

下一篇详细介绍相关的情况。