更新程序包运行时限制PackageReference升级版本

在用于NuGet的.NET较旧的packages.config系统下, 我可以通过使用Package元素上的allowedVersions属性来约束在更新包时考虑的包的可能版本

  

当在Visual Studio中为包含上述项目的项目运行update-package ,不会对Newtonsoft.Json更新,因为我已使用allowedVersions属性固定到10.0.3。

如何在PackageReference下实现这一目标? 将Semver语法应用于Version属性仅影响已还原的版本 – 它不会限制更新。 因此,如果我指定下面的PackageReference并运行update-package ,我将例如升级到11.0.1,如果11.0.1在我的NuGet存储库中。

  

背景

我们依靠命令行工具来更新包,因为我们有快速移动的内部包(每天更新多次)和更稳定的低移动包(例如:ASP.NET)。 在大型代码库中, .csproj文件中手动更新每个依赖项对我们来说根本不可扩展(并且容易出错)。 在packages.config我们可以“固定”我们不想升级的第三方软件包,并且还可以更新到最新的快速移动依赖项。

从这个答案 :

目前,这是不可能的。 请参阅此GitHub问题以进行跟踪。

但是,用于添加引用的cli命令支持通过重新运行dotnet add package The.Package.Id更新项目中的单个包。

来自GitHub第4358期 :

尚未update PackageReference替换,修改引用的命令仅在dotnet

您可能希望权衡打开function请求GitHub问题4103 (4358作为重复关闭)。 微软并未高度重视此function(最初于2016年10月开放)。

可能的解决方法

选项1

可以通过删除和添加引用来“更新”依赖关系。 根据这篇文章 ,使用该命令明确指定版本将安装确切版本 ,而不是最新版本。 我还确认您可以使用以下命令添加版本约束:

 dotnet remove NewCsproj.csproj package Newtonsoft.Json dotnet add NewCsproj.csproj package Newtonsoft.Json -v [10.0.3] 

你可以用这些命令做什么:

  1. 在文本文件中保留包的版本号(可能只是将其命名为packages.config )。
  2. 使用脚本创建自己的“更新”命令,该命令读取文本文件并使用上述2个命令处理循环中的每个依赖项。 该脚本可以设置为传递.sln文件来处理其中的每个项目。

选项2

使用MSBuild从公共MSBuild文件“导入”依赖项,您可以在一个位置更新版本。

您可以定义自己的元素,以包含每个项目的特定依赖项。

SomeProject.csproj

  Newtonsoft.Json;FastMoving  ...  

Dependencies.proj