2009-10-21 13 views

Respuesta

1

La salida de exechace ir a la salida estándar a menos especifica el atributo output.

+0

entrega de la hormiga de salida no es la salida completa. Si lo redirijo a un archivo, obtengo una cosa totalmente diferente. – Geo

+0

Esto es cierto para los sistemas Unix. Pero en los sistemas Windows, si llama a un archivo por lotes que a su vez llama a otros comandos (como 'node.exe'), entonces se pierden los procesos stdout y stderror del proceso child node.exe. Consulte el _hack_ que describo como una respuesta si está en Windows y tiene este problema. – darcyparker

0

Si desea realizar una salida a System.out, simplemente no especifique el atributo "salida". Si desea redirigir a un archivo Y imprimirlo a System.out, puede usar el comando tee, que redirigirá la salida a un archivo determinado y también lo hará eco a la salida estándar ... No sé si Windows admite " tee "o un equivalente.

0

Quizás desee consultar también los atributos error, logError y errorproperty de la tarea exec. Estos tratan con el manejo del flujo de error estándar del proceso ejecutado. Puede que haya información útil que esté funcionando por algún motivo, lo que podría explicar la falta de integridad que observa.

Pero, si el proceso ejecutado decide cerrar stdout o stderr y enviarlos a otro lugar, hay poco que puede hacer.

14

Al ejecutar un archivo por lotes con las tareas apply o exec de ant en Windows, encontré que hay casos especiales en los que stdr y stderr no son capturados por hormiga. (Por ejemplo: si se llama a un archivo por lotes que a su vez llama a otros comandos (como node.exe), entonces la salida estándar y estándar de error del proceso hijo node.exe se pierde.)

Pasé mucho tiempo tratando de depurar este! Parece que se capturan stdout y stderr del archivo por lotes, pero los comandos invocados por el archivo por lotes no se ven de alguna manera por hormiga. (tal vez porque son procesos secundarios separados). El uso de los atributos output y error como se sugiere arriba no ayuda porque solo se captura algunos de stdout y/o stderr.

La solución que se me ocurrió (un piratear) es añadir estos argumentos al final del comando:

<!--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;"/> 

Debido a que este hackear sólo se aplica a las ventanas, recuerde agregar @osfamily="windows" a la tarea apply o exec. Y cree tareas similares para `@ osfamily =" unix ", etc., pero sin estos argumentos adicionales.

+0

Muchas gracias, Darcy! – JonnyReeves

+0

¡Finalmente! Funciona muy bien, thx. –

0

Me he encontrado con un problema similar: la salida de la ejecución del comando se ha suprimido. Quizás ese es el efecto secundario al ejecutar cmd en WinXP (I a usando maven-antrun-plugin).De todos modos el establecimiento output="con" funcionó perfectamente:

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

Trabajar con Ant y Gruntjs:

Para cualquiera que trate de conseguir que esto funcione utilizando Gruntjs. Pude hacerlo funcionar haciendo lo siguiente (en combinación con la respuesta de darcyparker).

En mi Ant Build archivo:

<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 

NOTA: Camino a gruñir estaría donde sus Gruntfile.js es situado. También tenga en cuenta que tuve que crear inicialmente el archivo de registro (para que funcione con la respuesta de darcyparker) que generaría el seguimiento de la pila de esa tarea en particular. Esto me daría la salida de la pila de tareas chirriantes desde donde llame a mi objetivo ant.

Finalmente, tenga en cuenta que pushd "C:\path\to\grunt\" no será necesario si los archivos de su bat están en el mismo directorio que su Gruntfile.js.

0

Estaba experimentando este mismo tipo de problema al tratar de hacer que el proceso de compilación fallara en Ant después de que las pruebas de Karma fallaran intencionalmente, y ejecutarlas con "prueba de grunt".

acaba de añadir/c antes "prueba Grunt", y funcionó como un encanto

<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> 
Cuestiones relacionadas