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

笔记哥 / 04-10 / 17点赞 / 0评论 / 608阅读
# 项目背景 最近开发一组类库,大约会有五六个项目。一个Core,加上若干面向不同产品的实现库,A/B/C/D...它们都依赖Core. 首先,我想统一版本号,这个容易,通过Directory.Build.props设置。 其次,每个库要单独发包。 问题是在开发阶段,子项目都是通过项目引用Core的,便于调试,怎么实现在打包时自动加上对Core包的依赖? 经过试验,可以总结三种方法: **一、生成时将 ProjectReference 转为 NuGet 依赖项 (Not Work)** 这个DeepSeek推荐的方案,但很遗憾,我没试验成功。 它的项目结构是这样的: ```csharp all true $(PackageVersion) MyProject.Core <_PackageReferencesToAdd Include="@(ProjectReference->WithMetadataValue('Publish', 'true'))"> %(PackageId) %(Version) ``` 它的核心思路是生成.nuspec前将项目引用强制转换在包引用。 我也问了Github Copilot,它也说行,but...请有经验的园友不吝赐教。 **二、按条件引用** 项目结构: ```csharp ``` 然后使用命令生成: ```csharp dotnet pack -p:IsPackaging=true ``` 此法可行。 **三、指定.nuspec文件** 最后,我又想到了用传统的.nuspec文件。(我很喜欢以前的包管理方式,packages.config/nuspec,不理解为什么MS非要把所有的东西都往project文件里塞。) 项目结构: ```csharp My.nuspec $(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. 验证可行。