msbuild条件下的大小写/类型敏感度

时间:2015-12-03 13:23:59

标签: msbuild

序言

在其他机器上运行了我自己的一些构建脚本之后,我发现它们无法正常工作,因为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上的条件是(〜?或者可能包括进一步的类型检查?〜)。

我在这里有点困惑。 msbuild在比较属性时如何/何时做出案例/类型检测?

1 个答案:

答案 0 :(得分:1)

MsBuild 在这里不区分大小写,问题在于第二个消息任务MSBuildLastTaskResult实际上是上一个任务被调用的结果,这是第一个Message任务和不再是复制任务了。如果你交换两个消息行,比如

,很容易看到
<Message Text="World" Importance="high" Condition="'$(MSBuildLastTaskResult)' == 'FaLse'" />
<Message Text="Hello" Importance="high" Condition="'$(MSBuildLastTaskResult)' == 'false'" />

输出将是

World
ALL CAPS
all lower