C#?多項(xiàng)目打包時(shí)如何將項(xiàng)目引用轉(zhuǎn)為包依賴(最新推薦)
項(xiàng)目背景
最近開(kāi)發(fā)一組類庫(kù),大約會(huì)有五六個(gè)項(xiàng)目。一個(gè)Core,加上若干面向不同產(chǎn)品的實(shí)現(xiàn)庫(kù),A/B/C/D...它們都依賴Core.
首先,我想統(tǒng)一版本號(hào),這個(gè)容易,通過(guò)Directory.Build.props設(shè)置。
其次,每個(gè)庫(kù)要單獨(dú)發(fā)包。
問(wèn)題是在開(kāi)發(fā)階段,子項(xiàng)目都是通過(guò)項(xiàng)目引用Core的,便于調(diào)試,怎么實(shí)現(xiàn)在打包時(shí)自動(dòng)加上對(duì)Core包的依賴?
經(jīng)過(guò)試驗(yàn),可以總結(jié)三種方法:
一、生成時(shí)將 ProjectReference 轉(zhuǎn)為 NuGet 依賴項(xiàng) (Not Work)
這個(gè)DeepSeek推薦的方案,但很遺憾,我沒(méi)試驗(yàn)成功。
它的項(xiàng)目結(jié)構(gòu)是這樣的:
<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前將項(xiàng)目引用強(qiáng)制轉(zhuǎn)換在包引用。
我也問(wèn)了Github Copilot,它也說(shuō)行,but...請(qǐng)有經(jīng)驗(yàn)的園友不吝賜教。
二、按條件引用
項(xiàng)目結(jié)構(gòu):
<ItemGroup>
<!-- 開(kāi)發(fā)時(shí)使用 ProjectReference -->
<ProjectReference Include="..\Core\MyProject.Core.csproj"
Condition="'$(IsPackaging)' != 'true'" />
<!-- 打包時(shí)使用 PackageReference -->
<PackageReference Include="MyProject.Core"
Version="$(PackageVersion)"
Condition="'$(IsPackaging)' == 'true'" />
</ItemGroup>然后使用命令生成:
dotnet pack -p:IsPackaging=true
此法可行。
三、指定.nuspec文件
最后,我又想到了用傳統(tǒng)的.nuspec文件。(我很喜歡以前的包管理方式,packages.config/nuspec,不理解為什么MS非要把所有的東西都往project文件里塞。)
項(xiàng)目結(jié)構(gòu):
<!-- 指定自定義 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.
驗(yàn)證可行。
到此這篇關(guān)于C# 多項(xiàng)目打包時(shí)如何將項(xiàng)目引用轉(zhuǎn)為包依賴的文章就介紹到這了,更多相關(guān)C# 多項(xiàng)目打包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#創(chuàng)建壓縮文件的實(shí)現(xiàn)代碼
本篇文章主要介紹了C# 創(chuàng)建壓縮文件的實(shí)現(xiàn)代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05
Unity的IPreprocessBuild實(shí)用案例深入解析
這篇文章主要為大家介紹了Unity的IPreprocessBuild實(shí)用案例深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05

