case/type msbuild 条件下的敏感性
case/type sensitivity in msbuild conditions
序言
在 运行 我自己在其他机器上的一些构建脚本之后,我发现它们无法工作,因为 svn
工具没有安装,并且由于我在 MSBuildLastTaskResult
上的一些条件属性 不正确(在条件中使用大写字母)。
问题
这里我不明白的是,某些属性的条件不区分大小写,而其他属性的条件区分大小写。看下面的例子:
<Project DefaultTargets="Test" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<MyProperty>FOoBAR</MyProperty>
</PropertyGroup>
<Target Name="Test">
<!-- Making sure `MSBuildLastTaskResult` will return `false` -->
<Copy SourceFiles="Does.Not.Exists" ContinueOnError="true"/>
<!-- Testing `MSBuildLastTaskResult` -->
<Message Text="Hello" Importance="high" Condition="'$(MSBuildLastTaskResult)' == 'false'" />
<Message Text="World" Importance="high" Condition="'$(MSBuildLastTaskResult)' == 'False'" />
<!-- Testing `MyProperty` -->
<Message Text="ALL CAPS" Importance="high" Condition="'$(MyProperty)' == 'FOOBAR'" />
<Message Text="all lower" Importance="high" Condition="'$(MyProperty)' == 'foobar'" />
</Target>
</Project>
它将在控制台中显示:
Hello
ALL CAPS
all lower
所以 MyProperty
上的条件似乎不区分大小写,而 MSBuildLastTaskResult
上的条件是(~?或者可能包含用于进一步类型检查?~)。
我在这里有点困惑。 How/when msbuild 正在决定在比较属性时进行 case/type 检测?
MsBuild 是这里不区分大小写,问题出在第二个消息任务MSBuildLastTaskResult
其实是上一个任务调用的结果,在这个是第一个消息任务,不再是复制任务。很容易看出你是否交换了两条消息行,如
<Message Text="World" Importance="high" Condition="'$(MSBuildLastTaskResult)' == 'FaLse'" />
<Message Text="Hello" Importance="high" Condition="'$(MSBuildLastTaskResult)' == 'false'" />
输出将是
World
ALL CAPS
all lower
序言
在 运行 我自己在其他机器上的一些构建脚本之后,我发现它们无法工作,因为 svn
工具没有安装,并且由于我在 MSBuildLastTaskResult
上的一些条件属性 不正确(在条件中使用大写字母)。
问题
这里我不明白的是,某些属性的条件不区分大小写,而其他属性的条件区分大小写。看下面的例子:
<Project DefaultTargets="Test" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<MyProperty>FOoBAR</MyProperty>
</PropertyGroup>
<Target Name="Test">
<!-- Making sure `MSBuildLastTaskResult` will return `false` -->
<Copy SourceFiles="Does.Not.Exists" ContinueOnError="true"/>
<!-- Testing `MSBuildLastTaskResult` -->
<Message Text="Hello" Importance="high" Condition="'$(MSBuildLastTaskResult)' == 'false'" />
<Message Text="World" Importance="high" Condition="'$(MSBuildLastTaskResult)' == 'False'" />
<!-- Testing `MyProperty` -->
<Message Text="ALL CAPS" Importance="high" Condition="'$(MyProperty)' == 'FOOBAR'" />
<Message Text="all lower" Importance="high" Condition="'$(MyProperty)' == 'foobar'" />
</Target>
</Project>
它将在控制台中显示:
Hello
ALL CAPS
all lower
所以 MyProperty
上的条件似乎不区分大小写,而 MSBuildLastTaskResult
上的条件是(~?或者可能包含用于进一步类型检查?~)。
我在这里有点困惑。 How/when msbuild 正在决定在比较属性时进行 case/type 检测?
MsBuild 是这里不区分大小写,问题出在第二个消息任务MSBuildLastTaskResult
其实是上一个任务调用的结果,在这个是第一个消息任务,不再是复制任务。很容易看出你是否交换了两条消息行,如
<Message Text="World" Importance="high" Condition="'$(MSBuildLastTaskResult)' == 'FaLse'" />
<Message Text="Hello" Importance="high" Condition="'$(MSBuildLastTaskResult)' == 'false'" />
输出将是
World
ALL CAPS
all lower