Как установить номер версии, специфичный для сборки, для projectReference, чтобы в зависимости от пакета NuGet была указана правильная версия

Используя новый формат CSProj в Visual Studio 2017, я написал файл целей для обработки новой конфигурации под названием CreateLocalPackages, который имеет сборку, создающую пакет NuGet в определенной локальной папке, и он автоматически увеличивает свой номер версии на единицу больше, чем наивысшее число в любом из пакетов решения в этой папке.

У моего решения есть несколько проектов, каждый из которых создает пакет NuGet, причем некоторые из них зависят от других проектов в решении.

Например, с этими файлами в локальном каталоге пакета:

BaseLibrary.2.1.0.1-betalocal.nupkg
BaseLibrary.2.1.0.1-betalocal.symbols.nupkg
BaseLibrary.Specialized.2.1.0.1-betalocal.nupkg
BaseLibrary.Specialized.2.1.0.1-betalocal.symbols.nupkg

Он решил бы создать эти пакеты в следующий раз, когда CreateLocalPackages Конфигурация была построена чистой:

BaseLibrary.2.1.0.2-betalocal.nupkg
BaseLibrary.2.1.0.2-betalocal.symbols.nupkg
BaseLibrary.Specialized.2.1.0.2-betalocal.nupkg
BaseLibrary.Specialized.2.1.0.2-betalocal.symbols.nupkg

Я получил это работает отлично, за исключением того факта, что Visual Studio, кажется, создает BaseLibrary\BaseLibrary.Specialized\obj\project.assets.json файл, прежде чем я могу подключиться к цели MSBuild и изменить $(версия) на 2.1.0.2, вызывая BaseLibrary.Specialized.2.1.0.2-betalocal.nupkg вместо этого просто ссылаться на эту зависимость: BaseLibrary.2.1.0-betalocal, Visual Studio создается для создания project.assets.json на этапе восстановления NuGet, который выполняется перед вызовом MSBuild для сборки проектов.

Я попытался запустить мою логику номера версии BeforeTargets="CollectPackageReferences;_ComputeTargetFrameworkItems" для того, чтобы позвонить в начале Restore целевая цепочка, но это не похоже на вызовы Visual Studio MSBuild /t:Restore для того, чтобы восстановить ссылки пакета NuGet (и генерировать project.assets.json). Я не знаю, есть ли у него своя логика или он вызывает другой инструмент.

Я хотел бы иметь возможность просто сказать VS перестроить и заставить его выяснить новую версию, собрать и упаковать все, а также перечислить правильные версии зависимостей.

1 ответ

Решение

Как установить номер версии, специфичный для сборки, для projectReference, чтобы в зависимости от пакета NuGet была указана правильная версия

Если я правильно вас понял, вы хотите назвать номер версии логической целью CreateLocalPackages до VS/MSBuild Restore цель.

Вы можете добавить MSBuild Target, которая запускается перед целевым Restore или _GenerateRestoreProjectSpec с помощью следующего фрагмента кода в файле MSBuild. * csproj:

  <Target Name="VersionNumberLogicBeforeRestore"
          BeforeTargets="Restore">
    <Message Text="Version Number Logic Before Restore!" Importance="high" />
  </Target>

Или же

  <Target Name="VersionNumberLogicBeforeRestore"
          BeforeTargets="_GenerateRestoreProjectSpec">
    <Message Text="Version Number Logic Before Restore!" Importance="high" />
  </Target>

Однако это работает только для dotnet cli, а не для Visual Studio.

dotnet restore "xx.csproj"

Кроме того, изменения восстановления NuGet будут частью 15.4, если они все еще вносятся. В противном случае 15.5.

См. Добавление поддержки для предварительного восстановления цели MSBuild, которая запускается Visual Studio, для получения подробной информации.

Итак, в данный момент мы должны использовать dotnet cli для вызова цели логики номера версии перед Restore цель, и вы также можете использовать Dotnet Cli построить проект.

Другие вопросы по тегам