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