2009-10-21 5 views
17

La tâche Ant exec a une propriété de sortie qui peut être utilisée pour indiquer à Ant où la sortie se passe. Je l'ai utilisé pour rediriger la sortie vers un fichier. La chose est, si je ne fais pas quelque chose avec la sortie, les choses que Ant imprime n'est pas beaucoup d'aide - ce n'est pas complet.Comment puis-je m'assurer que toutes les sorties de la tâche exec de Ant vont sur stdout?

Est-il possible de définir la propriété de sortie sur System.out?

Répondre

1

La sortie de exec-t aller à la sortie standard à moins vous spécifiez l'attribut output.

+0

de donner de la fourmi de sortie n'est pas la sortie complète. Si je le redirige vers un fichier, je reçois une chose totalement différente. – Geo

+0

Cela est vrai pour les systèmes Unix. Mais sur les systèmes Windows, si vous appelez un fichier de commandes qui appelle à son tour d'autres commandes (comme 'node.exe'), alors stdout et stderror du processus enfant node.exe sont perdus. Voir le _hack_ Je décris comme une réponse si vous êtes sur Windows et avoir ce problème. – darcyparker

0

Si vous souhaitez exporter vers System.out, ne spécifiez simplement pas l'attribut "output". Si vous souhaitez rediriger vers un fichier ET l'imprimer vers System.out, vous pouvez utiliser la commande tee, qui redirigera la sortie vers un fichier donné et aussi l'affichera en sortie standard ... Je ne sais pas si Windows prend en charge " tee "ou un équivalent.

0

Peut-être que vous voulez aussi regarder les attributs error, logError, et errorproperty de la tâche exec aussi. Ils traitent de la gestion du flux d'erreurs standard à partir du processus exec'd. Il peut y avoir des informations utiles là-bas qui, pour une raison quelconque, sont en train de disparaître - ce qui pourrait expliquer l'incomplétude que vous voyez. Mais, si le processus exec'd décide de fermer stdout ou stderr et de les envoyer ailleurs, il y a peu de choses que vous pouvez faire.

14

Lors de l'exécution d'un fichier de commandes avec apply de fourmis ou exec tâches sous Windows, je trouve qu'il ya des cas particuliers où certains des stdout et stderr est pas pris par la fourmi. (Par exemple: si vous appelez un fichier batch qui appelle à son tour d'autres commandes (comme node.exe), le stdout et stderror de l'enfant processus node.exe est perdu.)

J'ai passé beaucoup de temps à essayer de déboguer cela! Il semble que stdout et stderr du fichier batch soient capturés, cependant les commandes appelées par le fichier batch ne sont pas vues par ant. (peut-être parce que ce sont des processus enfants distincts). L'utilisation des attributs output et error comme suggéré ci-dessus n'aide pas parce que seulement certains de la stdout et/ou stderr est capturé.

La solution que je suis venu avec (un pirater) est d'ajouter ces arguments à la fin de la commande:

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

applique uniquement aux fenêtres Parce que ce pirater, souvenez-vous d'ajouter @osfamily="windows" à la tâche apply ou exec. Et créez des tâches similaires pour `@ osfamily =" unix ", etc mais sans ces arguments supplémentaires.

+0

Merci beaucoup, Darcy! – JonnyReeves

+0

Enfin! Fonctionne très bien, merci. –

0

J'ai rencontré un problème similaire: la sortie de l'exécution de la commande a été supprimée. Peut-être que c'est l'effet secondaire lors de l'exécution cmd sous WinXP (I an en utilisant maven-antrun-plugin).Quoi qu'il en soit la mise en output="con" a parfaitement:

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

Travailler avec Ant et Gruntjs:

Pour tous ceux qui essaient d'obtenir ce travail en utilisant Gruntjs. J'ai été en mesure de le faire fonctionner en faisant ce qui suit (en combinaison avec la réponse de darcyparker).

Dans mon Ant fichier de construction:

<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 

REMARQUE: chemin grogner serait l'endroit où vos Gruntfile.js est situé. Notez également que j'ai dû créer initialement le fichier journal (pour l'utiliser avec la réponse de darcyparker), ce qui produirait la trace de la pile à partir de cette tâche particulière. Cela me donnerait alors la sortie de la pile de tâches grunt de partout où j'appelle ma cible de fourmi.

Enfin, notez que pushd "C:\path\to\grunt\" ne sera pas nécessaire si vos fichiers bat sont dans le même répertoire que votre Gruntfile.js.

0

Je faisais l'expérience de ce même type de problème en essayant de faire échouer le processus de construction dans Ant après que les tests de Karma aient intentionnellement échoué, et en les exécutant avec un "test de grognement".

vient d'être ajouté/c avant « test grunt », et cela a fonctionné comme un charme

<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> 
Questions connexes