【问题标题】:Constrain PackageReference upgrade version when update-package runupdate-package 运行时约束 PackageReference 升级版本
【发布时间】:2018-08-30 02:47:58
【问题描述】:

在用于 NuGet 的 .NET 较旧的 packages.config 系统下,I could constrain the possible versions of a package 在使用 Package 元素上的 allowedVersions 属性更新包时被考虑

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

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

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

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

背景

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

【问题讨论】:

    标签: c# nuget .net-standard nuget-update packagereference


    【解决方案1】:

    来自this answer

    目前,这是不可能的。请参阅this GitHub issue 进行跟踪。

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

    来自GitHub Issue 4358

    目前还没有PackageReference替代update,修改引用的命令只在dotnet中。

    您可能想要权衡关于此的开放功能请求GitHub issue 4103(4358 已作为副本关闭)。 Microsoft 并未高度重视此功能(最初于 2016 年 10 月开放)。

    可能的解决方法

    选项 1

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

    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 文件中“导入”依赖项,您可以在一个位置更新版本。

    您可以定义自己的 &lt;IncludeDependencies&gt; 元素以包含每个项目的特定依赖项。

    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>
    

    【讨论】:

    • 感谢您的回复。我们依赖命令行工具来更新包,因为我们既有快速移动的内部包(一天更新多次)和更稳定的低移动包(例如:ASPNET)。在大型代码库中,手动更新 csproj 文件中的每个依赖项对我们来说根本无法扩展(并且容易出错)。在 packages.config 下,我们可以“固定”我们不想升级的第三方包,也可以更新到最新的快速移动依赖项。
    • 谢谢。如果您不想等待 Microsoft 实施此功能,我已经用几个可能的选项更新了我的答案。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-08-18
      • 1970-01-01
      • 2021-02-27
      • 2016-03-27
      • 2020-03-24
      • 2021-08-25
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      相关资源
      最近更新 更多