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

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

经验文章nimo972025-07-08 6:43:192A+A-

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

在之前的.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->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference')->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项目中的选项。
下一篇详细介绍相关的情况。

作者:CnSharp工作室

出处:
http://www.cnblogs.com/cnsharp/

本文版权归CnSharp.com所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

点击这里复制本文地址 以上内容由nimo97整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

尼墨宝库 © All Rights Reserved.  蜀ICP备2024111239号-7