Ограничить версию обновления PackageReference при запуске пакета обновления

Под.NET старше packages.config Система для NuGet, я мог бы ограничить возможные версии пакета, которые рассматриваются при обновлении пакетов с помощью allowedVersions атрибут в элементе Package

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

когда update-package запускается в Visual Studio для проекта, включающего выше, обновление не будет происходить для Newtonsoft.Json потому что я приколол 10.0.3 с помощью allowedVersions приписывать.

Как я могу добиться этого под 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 мы можем "закрепить" сторонние пакеты, которые мы не хотим обновлять, а также обновить до последних быстро меняющихся зависимостей.

3 ответа

Решение

Из этого ответа:

На данный момент это невозможно. Смотрите эту проблему GitHub для отслеживания.

Однако команды cli для добавления ссылок поддерживают обновление отдельных пакетов в проекте путем повторного запуска dotnet add package The.Package.Id,

Из GitHub Issue 4358:

Здесь нет PackageReference замена для update Тем не менее, команда для изменения ссылок только в dotnet,

Возможно, вы захотите взвесить вопрос об открытии функции GitHub 4103 по этому поводу (4358 был закрыт как дубликат). Microsoft не придает большого значения этой функции (изначально она была открыта в октябре 2016 года).

Возможные обходные пути

Опция 1

Можно "обновить" зависимость, удалив и добавив ссылку. Согласно этому сообщению, указание версии явно с помощью команды установит точную версию, а не последнюю версию. Я также подтвердил, что вы можете добавить ограничения версии с помощью команды:

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

Что вы могли бы сделать с этими командами:

  1. Храните номера версий пакетов в текстовом файле (возможно, просто держите его по имени packages.config).
  2. Используйте сценарий для создания своей собственной команды "update", которая читает текстовый файл и обрабатывает каждую зависимость в цикле, используя вышеупомянутые 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 Sdk="Microsoft.NET.Sdk">

    <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>
Другие вопросы по тегам