执行摘要:我希望根据仅在构建管道后期存在的条件,在属性组中设置属性,并寻找一种更早解决此问题的方法。
我有一个相当简单的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 框架项目,同时也依赖于 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 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
变量并且它指向正确的值,但构建程序仍然使用旧值并未重定向输出。