【发布时间】:2020-02-13 07:38:19
【问题描述】:
执行摘要:我想根据仅在构建管道后期出现的条件设置属性组中的属性,并且正在寻找一种更早解决此问题的方法。
我有一个相当简单的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 变量,它指向正确的值,但构建使用旧值而不是重定向输出。
【问题讨论】:
标签: msbuild