Ant exec
任务有一个输出属性,可用于告诉Ant输出的位置。我用它将输出重定向到文件。问题是,如果我不对输出做些什么,Ant打印的东西不是那么多帮助 - 它不完整。
是否有将输出属性设置为System.out
?
答案 0 :(得分:16)
在Windows上执行带有ant的apply
或exec
任务的批处理文件时,我发现有些特殊情况下ant没有捕获某些stdout和stderr。 (例如:如果您调用批处理文件,而该批处理文件又调用其他命令(如node.exe
),则子node.exe
进程中的stdout和stderror将丢失。)
我花了很长时间试图调试这个!似乎批处理文件的stdout和stderr被捕获,但批处理文件调用的命令在某种程度上不被ant看到。 (也许是因为它们是独立的子进程)。使用上面建议的output
和error
属性没有帮助,因为只捕获了stdout和/或stderr的某些。
我提出的解决方案( hack )是在命令末尾添加这些参数:
<!--Next arg: forces node's stderror and stdout to a temporary file-->
<arg line=" > _tempfile.out 2<&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 & del _tempfile.out & exit /b 1)"/>
<!--Next arg: Otherwise, just type the temporary file and delete it-->
<arg line=" & type _tempfile.out & del _tempfile.out &"/>
由于此 hack 仅适用于Windows,因此请务必将@osfamily="windows"
添加到apply
或exec
任务中。并为`@ osfamily =“unix”等创建类似的任务,但没有这些额外的参数。
答案 1 :(得分:1)
exec
的输出会转到标准输出,除非指定output
属性。
答案 2 :(得分:0)
如果要输出到System.out,则只需不指定“output”属性。如果您想重定向到文件并将其打印到System.out,您可以使用tee命令,它将输出重定向到给定文件并将其回显到标准输出...我不知道如果Windows支持“tee”或等效的。
答案 3 :(得分:0)
也许您想要查看exec任务的error
,logError
和errorproperty
属性。这些处理来自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=" > jshint.log 2<&1"/>
<arg line=" || (type jshint.log & del jshint.log & exit /b 1)"/>
<arg line=" & type jshint.log & del jshint.log &"/>
</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>