qidao123.com技术社区-IT企服评测·应用市场

标题: C# 多项目打包时如何将项目引用转为包依赖 [打印本页]

作者: 拉不拉稀肚拉稀    时间: 2025-4-11 01:56
标题: C# 多项目打包时如何将项目引用转为包依赖
项目背景

最近开辟一组类库,大约会有五六个项目。一个Core,加上若干面向不同产品的实现库,A/B/C/D...它们都依赖Core.
起首,我想统一版本号,这个容易,通过Directory.Build.props设置。
其次,每个库要单独发包。
问题是在开辟阶段,子项目都是通过项目引用Core的,便于调试,怎么实现在打包时自动加上对Core包的依赖?
颠末试验,可以总结三种方法:
一、生成时将 ProjectReference 转为 NuGet 依赖项 (Not Work)
这个DeepSeek保举的方案,但很遗憾,我没试验成功。
它的项目结构是这样的:
  1. <ItemGroup>
  2.   <ProjectReference Include="..\Core\MyProject.Core.csproj" >
  3.     <PrivateAssets>all</PrivateAssets>
  4.     <Publish>true</Publish>
  5.     <Version>$(PackageVersion)</Version>
  6.     <PackageId>MyProject.Core</PackageId>
  7.   </ProjectReference>
  8. </ItemGroup>
  9. <Target Name="ForcePackageReferenceConversion" BeforeTargets="GenerateNuspec">
  10.   <ItemGroup>
  11.     <_PackageReferencesToAdd Include="@(ProjectReference->WithMetadataValue('Publish', 'true'))">
  12.       <PackageId>%(PackageId)</PackageId>
  13.       <Version>%(Version)</Version>
  14.     </_PackageReferencesToAdd>
  15.     <PackageReference Include="@(_PackageReferencesToAdd->'%(PackageId)')" Version="%(Version)" />
  16.   </ItemGroup>
  17. </Target>
复制代码
它的核心思路是生成.nuspec前将项目引用强制转换在包引用。
我也问了Github Copilot,它也说行,but...请有经验的园友不吝见教。
二、按条件引用
项目结构:
  1. <ItemGroup>
  2.   
  3.   <ProjectReference Include="..\Core\MyProject.Core.csproj"
  4.                     Condition="'$(IsPackaging)' != 'true'" />
  5.   
  6.   <PackageReference Include="MyProject.Core"
  7.                     Version="$(PackageVersion)"
  8.                     Condition="'$(IsPackaging)' == 'true'" />
  9. </ItemGroup>
复制代码
然后使用命令生成:
  1. dotnet pack -p:IsPackaging=true
复制代码
此法可行。
三、指定.nuspec文件
末了,我又想到了用传统的.nuspec文件。(我很喜好以前的包管理方式,packages.config/nuspec,不理解为什么MS非要把所有的东西都往project文件里塞。)
项目结构:
  1.       My.nuspec<ItemGroup>
  2.   
  3.   <ProjectReference Include="..\Core\MyProject.Core.csproj"
  4.                     Condition="'$(IsPackaging)' != 'true'" />
  5.   
  6.   <PackageReference Include="MyProject.Core"
  7.                     Version="$(PackageVersion)"
  8.                     Condition="'$(IsPackaging)' == 'true'" />
  9. </ItemGroup>$(NuspecProperties);      id=$(PackageId);      version=$(Version);      company=$(Company);      authors=$(Authors);      product=$(Product);      copyright=$(Copyright);      license=$(PackageLicenseExpression);      projectUrl=$(PackageProjectUrl);      repositoryUrl=$(RepositoryUrl);      repositoryType=$(RepositoryType);      icon=$(PackageIcon);      config=$(Configuration)   
复制代码
它将Directory.Build.props中界说的属性一一赋给nuspec.
验证可行。
 
<ItemGroup>
  
  <rojectReference Include="..\Core\MyProject.Core.csproj"
                    Condition="'$(IsPackaging)' != 'true'" />

  
  <ackageReference Include="MyProject.Core"
                    Version="$(PackageVersion)"
                    Condition="'$(IsPackaging)' == 'true'" />
</ItemGroup>出处:http://www.cnblogs.com/cnsharp/<ItemGroup>
  
  <rojectReference Include="..\Core\MyProject.Core.csproj"
                    Condition="'$(IsPackaging)' != 'true'" />

  
  <ackageReference Include="MyProject.Core"
                    Version="$(PackageVersion)"
                    Condition="'$(IsPackaging)' == 'true'" />
</ItemGroup>本文版权归CnSharp.com和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文毗连,否则保留追究法律责任的权利.
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4