如何确保Ant的exec任务的所有输出都转到stdout?

时间:2009-10-21 18:17:12

标签: ant exec

Ant exec任务有一个输出属性,可用于告诉Ant输出的位置。我用它将输出重定向到文件。问题是,如果我不对输出做些什么,Ant打印的东西不是那么多帮助 - 它不完整。

是否有将输出属性设置为System.out

7 个答案:

答案 0 :(得分:16)

在Windows上执行带有ant的applyexec任务的批处理文件时,我发现有些特殊情况下ant没有捕获某些stdout和stderr。 (例如:如果您调用批处理文件,而该批处理文件又调用其他命令(如node.exe),则子node.exe进程中的stdout和stderror将丢失。)

我花了很长时间试图调试这个!似乎批处理文件的stdout和stderr被捕获,但批处理文件调用的命令在某种程度上不被ant看到。 (也许是因为它们是独立的子进程)。使用上面建议的outputerror属性没有帮助,因为只捕获了stdout和/或stderr的某些

我提出的解决方案( hack )是在命令末尾添加这些参数:

<!--Next arg: forces node's stderror and stdout to a temporary file-->
<arg line=" &gt; _tempfile.out 2&lt;&amp;1"/>

<!--Next arg: If command exits with an error, then output the temporary file to stdout, -->
<!--delete the temporary file and finally exit with error level 1 so that    -->
<!--the apply task can catch the error if @failonerror="true"                -->
<arg line=" || (type _tempfile.out &amp; del _tempfile.out &amp; exit /b 1)"/>

<!--Next arg: Otherwise, just type the temporary file and delete it-->
<arg line=" &amp; type _tempfile.out &amp; del _tempfile.out &amp;"/>

由于此 hack 仅适用于Windows,因此请务必将@osfamily="windows"添加到applyexec任务中。并为`@ osfamily =“unix”等创建类似的任务,但没有这些额外的参数。

答案 1 :(得分:1)

exec 的输出会转到标准输出,除非指定output属性。

答案 2 :(得分:0)

如果要输出到System.out,则只需不指定“output”属性。如果您想重定向到文件并将其打印到System.out,您可以使用tee命令,它将输出重定向到给定文件并将其回显到标准输出...我不知道如果Windows支持“tee”或等效的。

答案 3 :(得分:0)

也许您想要查看exec任务的errorlogErrorerrorproperty属性。这些处理来自exec'd进程的标准错误流的处理。由于某种原因,那里可能会有一些有用的信息 - 这可能会导致你看到的不完整。

但是,如果exec'd进程决定关闭stdout或stderr并将它们发送到其他地方 - 你几乎无能为力。

答案 4 :(得分:0)

我遇到过类似的问题:命令执行的输出被抑制了。也许这是在WinXP下运行cmd时的副作用(我使用maven-antrun-plugin)。无论如何设置output="con"完美地完成了:

<configuration>
    <target>
        <exec executable="cmd" output="con">
            <arg value="/c" />
            <arg value="..." />
        </exec>
    </target>
</configuration>

答案 5 :(得分:0)

使用Ant和Gruntjs:

对于任何试图使用Gruntjs工作的人。我能够通过以下方式使其工作(与darcyparker的答案结合)。

在我的Ant构建文件中:

<target description="run grunt js tasks" name="grunt">  
    <exec  dir="/path/to/grunt" executable="cmd" failonerror="true">
        <arg value="/c"/>
        <arg value="jshint.bat"/> // I broke each task into it's own exec
        <arg line=" &gt; jshint.log 2&lt;&amp;1"/>
        <arg line=" || (type jshint.log &amp; del jshint.log &amp; exit /b 1)"/>
        <arg line=" &amp; type jshint.log &amp; del jshint.log &amp;"/>
    </exec>
    <exec  dir="/path/to/grunt" executable="cmd" failonerror="true">
        // another grunt task (IE: uglify, cssmin, ect..)
    </exec>
</target>

<强> jshint.bat

@echo off
pushd "C:\path\to\grunt\" 
@ECHO _____________________________________________
@ECHO GRUNT JSHINT
@ECHO _____________________________________________
grunt jshint --stack >>jshint.log

注意: grunt的路径是 Gruntfile.js 所在的位置。另请注意,我必须首先创建日志文件(以使其与darcyparker一起使用),该文件将从该特定任务输出堆栈跟踪。然后,无论我在哪里调用我的蚂蚁目标,这都会给我带来咕噜声的任务堆栈输出。

最后请注意,如果您的蝙蝠文件与pushd "C:\path\to\grunt\"位于同一目录中,则Gruntfile.js将不再存在。

答案 6 :(得分:-1)

我遇到了同样的问题,试图在Karma测试失败后尝试让Ant中的构建过程失败,然后用&#34; grunt test&#34;来执行它们。

在&#34; grunt test&#34;之前添加/ c,它就像一个魅力

<target name="unittest">
    <echo>*** KARMA UNIT TESTING ***</echo>
    <exec dir="api_ui" executable="cmd" osfamily="windows" logError="yes" failonerror="true">
        <arg value="/c grunt test"/>
    </exec>
</target>