Как установить номер версии сборки для 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 и изменить $(Version) на 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 Rebuild и заставить его определить новую версию, собрать и упаковать все, а также указать правильные версии зависимостей.


person Jeremy Morton    schedule 31.10.2017    source источник


Ответы (1)


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

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

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

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

Or

  <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 для сборки проекта.

person Leo Liu-MSFT    schedule 01.11.2017
comment
У меня есть только логика номера версии в конфигурации CreateLocalPackages, поэтому каждая сборка конфигурации отладки или выпуска (т. Е. Обычное изменение, сборка, запуск, цикл разработки отладки) не пытается увеличить версию и создать пакет. Как я могу указать dotnet restore использовать определенную конфигурацию? - person Jeremy Morton; 02.11.2017
comment
@JeremyMorton, насколько мне известно, мы не могли сказать dotnet restore использовать определенную конфигурацию, потому что теперь NuGet поддерживает только несколько версий платформы .NET, а не несколько конфигураций. stackoverflow.com/questions/45635618/ - person Leo Liu-MSFT; 02.11.2017