多目标框架.NET项目条件NuGet包引用升级方案咨询
多目标框架项目NuGet包版本升级规范方案
VS 内置的 NuGet 包管理器 GUI 目前暂不直接支持按目标框架差异化升级条件引用的包,可采用以下几种官方推荐的规范方案处理:
方案1:MSBuild 属性统一管理版本号
将不同目标框架对应的依赖版本统一定义在项目文件顶部的PropertyGroup节点中,后续升级仅需修改对应版本属性即可,无需逐个修改每个包引用的版本号。
改造后的项目配置示例:<PropertyGroup> <TargetFrameworks>netstandard2.0;net6.0</TargetFrameworks> <!-- 统一定义各目标框架下的依赖版本 --> <EfCoreVersionNetStandard20>3.1.31</EfCoreVersionNetStandard20> <EfCoreVersionNet60>6.0.25</EfCoreVersionNet60> <CommonExtensionsVersionNetStandard20>3.1.31</CommonExtensionsVersionNetStandard20> <CommonExtensionsVersionNet60>6.0.25</CommonExtensionsVersionNet60> </PropertyGroup> <ItemGroup> <PackageReference Include="morelinq" Version="3.3.2" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.1" /> </ItemGroup> <ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' "> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="$(EfCoreVersionNetStandard20)" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="$(EfCoreVersionNetStandard20)" /> <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="$(CommonExtensionsVersionNetStandard20)" /> <PackageReference Include="Microsoft.Extensions.Options.DataAnnotations" Version="$(CommonExtensionsVersionNetStandard20)" /> </ItemGroup> <ItemGroup Condition=" '$(TargetFramework)' == 'net6.0' "> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="$(EfCoreVersionNet60)" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="$(EfCoreVersionNet60)" /> <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="$(CommonExtensionsVersionNet60)" /> <PackageReference Include="Microsoft.Extensions.Options.DataAnnotations" Version="$(CommonExtensionsVersionNet60)" /> </ItemGroup>方案2:使用.NET 原生中央包管理(CPM)
这是微软官方推荐的全解决方案包版本管理方案,适合有多个多目标框架项目的场景:- 在解决方案根目录新建
Directory.Packages.props文件,统一配置所有包的版本,支持按目标框架设置条件版本 - 项目文件中的
PackageReference无需再写Version属性,版本自动从中央配置继承
中央配置示例:
<Project> <PropertyGroup> <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally> </PropertyGroup> <ItemGroup> <!-- 全局通用包版本 --> <PackageVersion Include="morelinq" Version="3.3.2" /> <PackageVersion Include="Newtonsoft.Json" Version="13.0.1" /> </ItemGroup> <!-- netstandard2.0 专属包版本 --> <ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' "> <PackageVersion Include="Microsoft.EntityFrameworkCore" Version="3.1.31" /> <PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="3.1.31" /> <PackageVersion Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.1.31" /> <PackageVersion Include="Microsoft.Extensions.Options.DataAnnotations" Version="3.1.31" /> </ItemGroup> <!-- net6.0 专属包版本 --> <ItemGroup Condition=" '$(TargetFramework)' == 'net6.0' "> <PackageVersion Include="Microsoft.EntityFrameworkCore" Version="6.0.25" /> <PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="6.0.25" /> <PackageVersion Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="6.0.25" /> <PackageVersion Include="Microsoft.Extensions.Options.DataAnnotations" Version="6.0.25" /> </ItemGroup> </Project>- 在解决方案根目录新建
方案3:使用 dotnet CLI 精准指定目标框架升级
需要单独升级某个目标框架下的包时,可直接使用 dotnet 命令行工具,通过--framework参数指定对应目标框架,不会影响其他框架的包版本,示例命令:# 升级 netstandard2.0 目标下的 EF Core 到最新的3.1.x版本 dotnet add package Microsoft.EntityFrameworkCore --version 3.1.31 --framework netstandard2.0 # 升级 net6.0 目标下的 EF Core 到最新的6.0.x版本 dotnet add package Microsoft.EntityFrameworkCore --version 6.0.25 --framework net6.0临时方案:切换VS目标框架上下文操作
在VS顶部的工具栏目标框架下拉框中,先选中你要升级包对应的目标框架,再打开「管理NuGet包」功能,此时升级操作只会作用于当前选中的目标框架,该方案偶发缓存异常,仅适合临时快速修改使用。
内容的提问来源于stack exchange,提问作者14207973
相关产品推荐
相关产品推荐

