Visual Studio 2022中NuGet如何强制安装最高版本依赖包
如何强制Visual Studio 2022中的NuGet安装依赖项最高可用版本
问题复现
在Visual Studio 2022中通过NuGet安装包时,无论是使用GUI管理界面还是包管理器控制台,都无法找到默认安装最高版本依赖的配置入口,手动给Install-Package命令加-DependencyVersion Highest参数也不生效。
以安装1.0.152版本的protobuf-net.Grpc为例,该包声明的依赖规则为Grpc.Core.Api >= 2.36.1,安装时NuGet默认拉取的是2.36.1版本,而非当时可用的最新稳定版2.46.3。执行命令和返回结果如下:
Install-Package protobuf-net.Grpc -DependencyVersion Highest Installing NuGet package protobuf-net.Grpc 1.0.152. Committing restore... Successfully installed 'Grpc.Core.Api 2.36.1' Successfully installed 'Microsoft.NETCore.Platforms 2.1.0' Successfully installed 'protobuf-net 2.4.6' Successfully installed 'protobuf-net.Grpc 1.0.152' Successfully installed 'System.Memory 4.5.3' Successfully installed 'System.Private.ServiceModel 4.5.3' Successfully installed 'System.Reflection.DispatchProxy 4.5.0' Successfully installed 'System.Security.Principal.Windows 4.5.0' Successfully installed 'System.ServiceModel.Primitives 4.5.3'
可行配置方案
- 全局修改NuGet默认解析规则
打开Visual Studio 2022顶部菜单栏,依次进入「工具」>「NuGet包管理器」>「包管理器设置」,在设置窗口左侧选择「常规」选项卡,找到默认依赖项解析行为的下拉菜单,把默认选中的「最低」改成「最高」,点击确定保存。这个配置是全局生效的,之后不管是用GUI点安装,还是在控制台敲命令,默认都会优先拉取最高版本的依赖。 - 注意控制台命令的参数限制
很多人踩过这个坑:Install-Package的-DependencyVersion参数只对当前命令直接安装的包的一级依赖生效,不会递归处理下层的传递依赖,所以之前加了参数也拿不到全链路最高版本,属于参数本身的设计限制,不是操作错了。如果要让当前命令的全链路依赖都优先选最高版本,执行命令前先删除项目obj目录下的project.assets.json缓存文件,避免NuGet直接读取本地缓存的旧依赖图,如果需要匹配预览版依赖,再额外加上-IncludePrerelease参数即可。 - 给SDK风格项目加固定配置
如果用的是.NET Core/.NET 5+的SDK风格项目,可以直接在项目根目录新建或修改NuGet.Config文件,加入如下配置,强制还原时始终选择最高版本依赖,不用每次安装包都手动加参数:<configuration> <config> <add key="dependencyVersion" value="Highest" /> </config> </configuration> - 兜底处理方案
如果做完以上配置还有个别依赖拉取的是低版本,直接在NuGet包管理器里单独搜索对应的依赖包,手动选最新稳定版安装就行,NuGet会自动更新依赖图,只要版本范围符合上游包的要求,不会出现冲突。
注意:如果项目之前已经装过对应依赖的低版本,先去解决方案资源管理器的「依赖项>包」节点下把旧版本手动卸载掉,再执行安装操作,不然NuGet会优先匹配项目里已经存在的版本约束,不会自动升级。
内容的提问来源于stack exchange,提问作者JohnUbuntu
相关产品推荐
相关产品推荐

