В предыдущем посте я говорил об использовании переменной для хранения пакетов NuGet в нескольких проектах; теперь есть (потенциально) лучший способ.
В предыдущем посте было продемонстрировано, как использовать переменные «для всего репозитория», расположенные в папке Directory.Build.props. Определив эти переменные, вы можете использовать переменную, а не буквальное значение, в своем csproj, чтобы сохранить зависимости во всем репозитории от одной и той же версии.
Теперь на https://github.com/NuGet/Home/wiki/Centrally-managing-NuGet-package-versions есть функция (находится на рассмотрении), которая позволяет делать то же самое, только более элегантным способом. По крайней мере, по моему мнению.
Находящаяся в обзоре функция опирается на новый репозиторий, похожий на файл, который называется Directory.Packages.props. Используя https://github.com/Kritner-Blogs/DirectoryBuildProps/releases/tag/v1.1 в качестве отправной точки, мы представим централизованное управление версиями пакетов.
Во-первых, мы обновим файл «Directory.Build.props», чтобы он содержал следующее:
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
Это сообщает Visual Studio, rider, dotnet cli и т. д. о том, что текущая папка, а также ее дочерние элементы (то есть широкий репозиторий, если он используется в корне репо), что используется централизованное управление версиями пакетов.
Создать Directory.Packages.props
В той же папке, что и «Directory.Build.props», мы создадим новый файл «Directory.Packages.props». Этот файл используется для указания версии пакета NuGet, используемой для всех пакетов, используемых в репозитории. Продолжая использовать «Kritner.SolarProjection», мы настроим наш новый файл «Directory.Packages.props», чтобы указать версию.
<Project>
<ItemGroup>
<PackageVersion Include="Kritner.SolarProjection" Version="1.0.2" />
</ItemGroup>
</Project>
Выше мы просто определяем пакет, а также версию, которую следует использовать, когда этот пакет указан в любом файле csproj на том же уровне или в качестве дочернего каталога, в котором находится файл «Directory.Build.props». расположен.
Обратите внимание, что приведенный выше файл не автоматически включает пакет в файлы csproj, он определяет только используемую версию, когда пакет указан в файле csproj.
Теперь, когда в нашем репозитории используется централизованное управление версиями пакетов, нам нужно внести обновления в наш файл csproj, чтобы использовать его; а именно удаление объявления версии из наших файлов csproj.
В настоящее время у нас есть следующее в нашем файле csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Kritner.SolarProjection" Version="$(NuGet-Kritner-SolarProjection)" />
</ItemGroup>
</Project>
В приведенном выше вы заметите, что используется старая версия «вариативного стиля», теперь с централизованным управлением пакетами нам даже это не нужно:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Kritner.SolarProjection" />
</ItemGroup>
</Project>
В предыдущем посте мы узнали, как использовать переменные для управления версиями наших пакетов nuget, используемых в репозитории, где это необходимо. В этом посте мы рассмотрели, как определить версию пакета в одном месте и использовать одну и ту же версию пакета во всем репозитории.
Однако при использовании централизованного управления версиями пакетов следует учитывать еще несколько моментов:
- Если версия пакета определена в csproj при включенном централизованном управлении версиями пакетов, вы получите ошибку компиляции. Это сделано (я полагаю), чтобы помочь разработчику «попасть в яму успеха», информируя его о том, что версия пакета либо уже определена на центральном уровне, и вам не нужно указывать версию, либо что версия пакета должна быть определена в файле «Directory.Packages.props».
- В связи с вышеуказанным пунктом вы по-прежнему можете переопределить версию пакета в csproj, используя свойство «OverrideVersion» (в отличие от свойства «Version») в файле csproj следующим образом:
- Вы по-прежнему можете использовать переменные в файлах реквизита, как показано на изображении выше. Мне нравится использовать эти переменные для определения версии пакета для набора пакетов, где все они выпущены с одинаковым номером версии в одно и то же время, даже один из них не обязательно изменился. за каждый пакет в наборе. Примеры того, где это может быть полезно, включают сам репозиторий aspnetcore, а также Microsoft Orleans — укажите версию набора пакетов, которую вы хотите использовать в качестве переменной, затем в вашем файле Build.Packages.props, полагаться на эту переменную для каждого используемого пакета, а не определять буквальную версию пакета для каждого пакета.
- https://github.com/NuGet/Home/wiki/Centrally-managing-NuGet-package-versions
- Код в начале поста
- Код в конце поста
Первоначально опубликовано на https://blog.kritner.com 1 октября 2021 г.