6

在 .NET 的旧版packages.configNuGet 系统下,我可以allowedVersions通过使用Package 元素上的属性来限制在更新包时考虑的包的可能版本

<package id="Newtonsoft.Json" version="10.0.3" allowedVersions="[10.0.3]" />

update-packageVisual Studio 中为包括上述内容的项目运行时,不会发生更新,Newtonsoft.Json因为我已使用该allowedVersions属性固定到 10.0.3。

我怎样才能在 下实现这一点PackageReference?将semver语法应用于 Version 属性只会影响恢复的版本- 它不会限制更新。因此,如果我指定以下内容PackageReference并运行update-package,例如,如果 11.0.1 在我的 NuGet 存储库中,我将升级到 11.0.1。

<PackageReference Include="Newtonsoft.Json" Version="[10.0.3]" />

背景

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

4

2 回答 2

3

这个答案

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

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

来自GitHub 问题 4358

目前还没有PackageReference替代品update,修改引用的命令仅在dotnet.

您可能想要权衡关于此的开放功能请求GitHub 问题 4103(4358 已作为副本关闭)。Microsoft 并未高度重视此功能(最初于 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 文件中“导入”依赖项,您可以在一个位置更新版本。

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

SomeProject.csproj

<Project Sdk="Microsoft.NET.Sdk">

    <IncludeDependencies>Newtonsoft.Json;FastMoving</IncludeDependencies>
    <Import Project="..\..\..\Dependencies.proj" />
  
    ...
  
</Project>

Dependencies.proj

<Project>

    <ItemGroup>
        <PackageReference Condition="$(IncludeDependencies.Contains('Newtonsoft.Json'))" Include="Newtonsoft.Json" Version="[10.0.3]" />
        <PackageReference Condition="$(IncludeDependencies.Contains('FastMoving'))" Include="FastMoving" Version="3.332.0" />
    </ItemGroup>
  
</Project>
于 2018-03-21T06:42:30.867 回答
1

这已经从https://github.com/NuGet/NuGet.Client/pull/2201开始实施。如果您使用的是任何版本的 NuGet 5,PackageReferencesemver 约束现在应该可以按预期工作。

于 2019-10-03T12:27:18.627 回答