锑砖 发表于 2025-6-6 08:44:08

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

此篇为上一篇[《.NET SDK样式项目打包时如何将项目引用转为包依赖》](https://www.cnblogs.com/cnsharp/p/18819771 ")的姊妹篇。
通常情况下,我们会将每个项目都生成一个包。但有时也可能一些特殊情况会将项目及其引用项目的相关文件都打进一个包。
在之前的.nuspec文件中,我们可以在节点中声明。SDK样式的项目中要怎么做呢?
变通

在NuGet Github Issue中有一条评论是这样的,他给出一个workaround.
<Project>
<PropertyGroup>
    <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
</PropertyGroup>

<Target Name="CopyProjectReferencesToPackage" DependsOnTargets="BuildOnlySettings;ResolveReferences">
    <ItemGroup>
      
      <_ReferenceCopyLocalPaths Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference')->WithMetadataValue('PrivateAssets', 'All'))"/>
    </ItemGroup>

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

    <ItemGroup>
      
      <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项目中的选项。
下一篇详细介绍相关的情况。
      出处:http://www.cnblogs.com/cnsharp/      本文版权归CnSharp.com和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: .NET SDK样式项目打包时如何将引用项目打进同一个包