Ant exec resultproperty不起作用

时间:2011-07-20 06:47:54

标签: ant build

我使用Ant exec任务调用批处理文件,并在resultpropery中设置结果。但返回值永远不会来到Ant。以下是我的代码

<property name="BuildErrorCode" value="abc"/>
<exec executable="cmd" resultproperty="BuildErrorCode" failonerror="false"
      dir="C:\workspace\build\">
    <arg value="/c"/>
    <arg value="cmake_cross_compile.bat"/>
</exec>

<echo message="Error Code:=${BuildErrorCode}" />

我退出我的批处理脚本:

if %errorlevel% neq 0 exit /b %errorlevel%

当脚本运行时,我总是将abc作为值而不是批处理文件的返回值。我的批处理文件现在返回2,我必须停止构建

我想做以下事情:

  1. 如果返回值是&lt;&gt; 0然后我必须使构建失败,现在没有发生。
  2. 知道如何让他返回值并使ant构建失败吗?

2 个答案:

答案 0 :(得分:8)

如果以详细模式(ant -v)运行构建脚本,您会注意到该行

Override ignored for property "BuildErrorCode"

基本上一旦设置了ant属性,就无法更改其值。这个SO question有详细信息。

可能的解决方法是不declare财产。

    ...
    <!--property name="BuildErrorCode" value="abc"/-->
    <exec executable = "cmd" resultproperty="BuildErrorCode" failonerror="false" dir="D:\work">
        <arg value="/c"/>
        <arg value="cmake_cross_compile.bat"/>
    </exec>
    ...

答案 1 :(得分:7)

exec任务resultproperty将捕获cmd解释器的退出代码。您在批处理文件中调用exit的方式虽然不是终止cmd,但它只退出脚本。 cmd的退出代码不受影响,保持为零。如果您只是删除exit命令的\b选项,您也将终止解释器,并查看您提供的退出代码。

if %errorlevel% neq 0 exit %errorlevel%

要失败,您可以使用fail task,也许是这样的:

<fail message="cmake_cross_compile.bat exited non-zero">
    <condition>
       <not>
         <equals arg1="${BuildErrorCode}" arg2="0"/>
       </not>
     </condition>
</fail>

或者您可以将failonerror="true"任务中的exec设置为立即失败。