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