項目背景
最近開發一組類庫,大約會有五六個項目。一個Core,加上若干面向不同產品的實現庫,A/B/C/D...它們都依賴Core.
首先,我想統一版本號,這個容易,通過Directory.Build.props設置。
其次,每個庫要單獨發包。
問題是在開發階段,子項目都是通過項目引用Core的,便于調試,怎么實現在打包時自動加上對Core包的依賴?
經過試驗,可以總結三種方法:
一、生成時將 ProjectReference 轉為 NuGet 依賴項 (Not Work)
這個DeepSeek推薦的方案,但很遺憾,我沒試驗成功。
它的項目結構是這樣的:
<ItemGroup>
<ProjectReference Include="..\Core\MyProject.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 Include="..\Core\MyProject.Core.csproj"
Condition="'$(IsPackaging)' != 'true'" />
<PackageReference Include="MyProject.Core"
Version="$(PackageVersion)"
Condition="'$(IsPackaging)' == 'true'" />
</ItemGroup>
然后使用命令生成:
dotnet pack -p:IsPackaging=true
此法可行。
三、指定.nuspec文件
最后,我又想到了用傳統的.nuspec文件。(我很喜歡以前的包管理方式,packages.config/nuspec,不理解為什么MS非要把所有的東西都往project文件里塞。)
項目結構:
<NuspecFile>My.nuspec</NuspecFile>
<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.
驗證可行。
轉自https://www.cnblogs.com/cnsharp/p/18819771?
該文章在 2025/4/11 8:37:16 編輯過