msbuild Directory.build.props каскад на проект? - PullRequest
1 голос
/ 13 февраля 2020

Резюме: я хочу установить свойства в группах свойств на основе условий, которые присутствуют только в конвейере сборки, и ищу способ решить эту проблему ранее.

У меня довольно простой Directory.build.props file

<Project>

  <PropertyGroup>
    <MyMode>Default</MyMode>
  </PropertyGroup>

  <!-- This one overrides the default group above -->
  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
    <MyMode>Changed to Debug</MyMode>
  </PropertyGroup>

  <!-- This one is not applied -->
  <PropertyGroup Condition=" '$(TargetFrameworkVersion)' == 'v4.7.2' ">
    <MyMode>Framework</MyMode>
  </PropertyGroup>


  <Target Name="Stats" AfterTargets="Build">
    <Message Importance="High" Text="::::: Mode set to $(MyMode)" />
    <Message Importance="High" Text="::::: Target Framework set to $(TargetFrameworkVersion)" />
  </Target>

</Project>

И простая структура проекта

E:.
│   Directory.build.props
│   MSBuild_Test.sln
│
├───ConsoleAppNet
│       App.config
│       ConsoleAppNet.csproj
│       Program.cs
│
└───MSBuild_Test
        Class1.cs
        LibStandard.csproj

LibStandard - это стандартная библиотека net, ConsoleAppNet - это каркасный проект net, который также имеет зависимость сборки до LibStandard

Когда я выполняю сценарий msbuild, описанный выше, я получаю этот вывод

  LibStandard -> E:\temp\MSBuild_Test\MSBuild_Test\bin\Debug\netstandard2.0\LibStandard.dll
  ::::: Mode set to Changed to Debug
  ::::: Target Framework set to v2.0
  ConsoleAppNet -> E:\temp\MSBuild_Test\ConsoleAppNet\bin\Debug\ConsoleAppNet.exe
  ::::: Mode set to Changed to Debug
  ::::: Target Framework set to v4.7.2

Как вы можете видеть, вывод консоли должен был инициировать группу свойств с условие, в результате которого MyMode составляет Framework, но это не сработало. Этот никогда не подходил:

  <PropertyGroup Condition=" '$(TargetFrameworkVersion)' == 'v4.7.2' ">
    <MyMode>Framework</MyMode>
  </PropertyGroup>

Есть ли хороший способ применить PropertyGroups во время загрузки на основе вышеуказанного условия?

Мне известно, что я могу поместить переопределения PropertyGroup в Target, например:

  <Target Name="TooLate" BeforeTargets="BeforeBuild" Condition=" '$(TargetFrameworkVersion' == 'v4.7.2' ">
    <PropertyGroup >
      <MyMode>Framework</MyMode>
    </PropertyGroup>
  </Target>

, и он также выполняется правильно, но в данный момент я не могу установить важные другие переменные.

Мое намерение состоит в том, чтобы перенаправить выходные каталоги в зависимости от различных условий. Когда я устанавливаю $(OutputPath) в качестве цели, уже слишком поздно. Проект игнорирует эти выходные данные для всей сборки этого проекта:

  <Target Name="TooLate" BeforeTargets="BeforeBuild" Condition=" '$(TargetFrameworkVersion)' == 'v4.7.2' ">
    <PropertyGroup >
      <OutputPath>New_Output_Directory</OutputPath>
    </PropertyGroup>
  </Target>

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

1 Ответ

0 голосов
/ 13 февраля 2020

Мне пять, я нашел решение для всех появляющихся Самуэлей, спрашивающих об одной и той же проблеме.

Быстрый ответ

На момент импорта Directory.build.props других свойств нет (например, TargetFramework) уже импортированы и будут по умолчанию до пусто . Вот почему проверки на них не проходят. Вместо этого используйте Directory.build.targets!

  • Directory.build.props очень импортированный ранний , что позволяет установить свойства в начале
  • Directory.build.targets импортированный очень поздний , позволяющий настроить цепочку сборки

Ресурсы

Вот несколько очень полезных страниц, касающихся msbuild

Объяснение

Вот цитата из параграфа на страница настройки (до тех пор, пока текущие документы остаются в живых ...)

Порядок импорта

Directory.Build.props импортируется очень рано в Microsoft.Common.props, а свойства, определенные позже, ему недоступны. Поэтому избегайте ссылок на свойства, которые еще не определены (и будут иметь пустое значение).

Directory.Build.targets импортируется из Microsoft.Common.targets после импорта файлов .targets из Пакеты NuGet. Таким образом, он может переопределять свойства и цели, определенные в большей части логики сборки c, но иногда вам может понадобиться настроить файл проекта после окончательного импорта.

При чтении это означает, что нечеткие цели, но Directory.Build.targets - лучшее место для переопределения свойств и использования условных проверок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...