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