Ограничить версию обновления 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
,
Здесь нет
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]
Что вы могли бы сделать с этими командами:
- Храните номера версий пакетов в текстовом файле (возможно, просто держите его по имени
packages.config
). - Используйте сценарий для создания своей собственной команды "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>