繁体   English   中英

update-package 运行时约束 PackageReference 升级版本

[英]Constrain PackageReference upgrade version when update-package run

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

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

在 Visual Studio 中为包含上述内容的项目运行update-package时, 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下,我们可以“固定”我们不想升级的第三方包,也可以更新到最新的快速移动依赖项。

这个答案

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

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

来自GitHub 问题 4358

还没有updatePackageReference替代品,修改引用的命令仅在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>

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

固定 - 另一种解决方法

这不会阻止更新,但如果这样做并更新,则会触发构建错误。 它对自动更新的用例没有多大帮助,但它可能会帮助其他进行手动更新并需要某种固定方式的人。

<ItemGroup>
    <PackageReference Include="MongoDB.Driver" Version="2.13.*" GeneratePathProperty="true" />
</ItemGroup>

<Target Name="CheckPkgVersions" AfterTargets="AfterBuild">
    <Error Condition="!$(PkgMongoDB_Driver.Contains('2.13.'))" Text="MongoDB.Driver must remain at version 2.13.* to be compatible with MongoDB 3.4.21" />
</Target>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM