Резюме: я хочу установить свойства в группах свойств на основе условий, которые присутствуют только в конце конвейера сборки, и я ищу способ решить эту проблему раньше.
У меня есть довольно простой файл Directory.build.props
<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 framework, который также имеет зависимость сборки от 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
, и она указывает на правильное значение, но сборка использует старое значение и не перенаправляет вывод.