C# 多项目打包时如何将项目引用转为包依赖

项目背景

最近开发一组类库,大约会有五六个项目。一个Core,加上若干面向不同产品的实现库,A/B/C/D...它们都依赖Core.

首先,我想统一版本号,这个容易,通过Directory.Build.props设置。

其次,每个库要单独发包。

问题是在开发阶段,子项目都是通过项目引用Core的,便于调试,怎么实现在打包时自动加上对Core包的依赖?

经过试验,可以总结三种方法:

一、生成时将 ProjectReference 转为 NuGet 依赖项 (Not Work)

这个DeepSeek推荐的方案,但很遗憾,我没试验成功。

它的项目结构是这样的:

<ItemGroup>   <ProjectReference Include="..CoreMyProject.Core.csproj" >     <PrivateAssets>all</PrivateAssets>     <Publish>true</Publish>     <Version>$(PackageVersion)</Version>     <PackageId>MyProject.Core</PackageId>   </ProjectReference> </ItemGroup>   <Target Name="ForcePackageReferenceConversion" BeforeTargets="GenerateNuspec">   <ItemGroup>     <_PackageReferencesToAdd Include="@(ProjectReference->WithMetadataValue('Publish', 'true'))">       <PackageId>%(PackageId)</PackageId>       <Version>%(Version)</Version>     </_PackageReferencesToAdd>     <PackageReference Include="@(_PackageReferencesToAdd->'%(PackageId)')" Version="%(Version)" />   </ItemGroup> </Target>

它的核心思路是生成.nuspec前将项目引用强制转换在包引用。

我也问了Github Copilot,它也说行,but...请有经验的园友不吝赐教。

二、按条件引用

项目结构:

<ItemGroup>   <!-- 开发时使用 ProjectReference -->   <ProjectReference Include="..CoreMyProject.Core.csproj"                     Condition="'$(IsPackaging)' != 'true'" />    <!-- 打包时使用 PackageReference -->   <PackageReference Include="MyProject.Core"                     Version="$(PackageVersion)"                     Condition="'$(IsPackaging)' == 'true'" /> </ItemGroup>

然后使用命令生成:

dotnet pack -p:IsPackaging=true

此法可行。

三、指定.nuspec文件

最后,我又想到了用传统的.nuspec文件。(我很喜欢以前的包管理方式,packages.config/nuspec,不理解为什么MS非要把所有的东西都往project文件里塞。)

项目结构:

  <!-- 指定自定义 nuspec 文件路径 -->     <NuspecFile>My.nuspec</NuspecFile>     <!-- 传递 MSBuild 属性到 nuspec 中的变量 -->     <NuspecProperties>$(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)     </NuspecProperties>

它将Directory.Build.props中定义的属性一一赋给nuspec.

验证可行。

 

发表评论

评论已关闭。

相关文章