Как я могу убедиться, что весь вывод Ant-задачи exec поступает на стандартный вывод? - PullRequest
19 голосов
/ 21 октября 2009

Задача Ant exec имеет свойство output, которое можно использовать, чтобы сообщить Ant, куда выводятся данные. Я использовал его, чтобы перенаправить вывод в файл. Дело в том, что если я ничего не делаю с выводом, то то, что печатает Ant, не так уж сильно помогает - оно не завершено.

Есть ли способ установить для свойства вывода значение System.out?

Ответы [ 7 ]

16 голосов
/ 28 апреля 2012

При выполнении командного файла с задачами ant apply или exec в Windows я обнаружил, что есть особые случаи, когда некоторые из stdout и stderr не перехватываются ant. (Например: если вы вызываете пакетный файл, который, в свою очередь, вызывает другие команды (например, node.exe), тогда stdout и stderror из дочернего процесса node.exe теряются.)

Я потратил много времени, пытаясь отладить это! Кажется, что stdout и stderr пакетного файла перехвачены, однако команды, вызываемые пакетным файлом, каким-то образом не видны ant. (возможно, потому что они являются отдельными дочерними процессами). Использование атрибутов output и error, как предложено выше, не помогает, потому что захватывается только некоторые 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;"/>

Поскольку этот хак относится только к окнам, не забудьте добавить @osfamily="windows" в задачу apply или exec. И создайте аналогичные задачи для `@ osfamily =" unix "и т. Д., Но без этих дополнительных аргументов.

1 голос
/ 21 октября 2009

Выход exec делает стандартным выходом , если не указан атрибут output.

0 голосов
/ 17 апреля 2015

Я сталкивался с такой же проблемой, пытаясь вызвать сбой процесса сборки в Ant после преднамеренного сбоя тестов Karma, и выполнял их с помощью "grunt test".

Только что добавили / 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>
0 голосов
/ 17 апреля 2015

Работа с 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

ПРИМЕЧАНИЕ: Путь к ворчанию будет там, где расположен ваш Gruntfile.js . Также обратите внимание, что мне пришлось сначала создать файл журнала (, чтобы он работал с ответом darcyparker ), который выводил бы трассировку стека от этой конкретной задачи. Затем это даст мне вывод стекающего задания, где бы я ни назвал свою цель муравья.

Наконец, обратите внимание, что pushd "C:\path\to\grunt\" не будет необходимым, если ваши файлы bat находятся в том же каталоге, что и ваши Gruntfile.js.

0 голосов
/ 18 февраля 2013

Я столкнулся с подобной проблемой: вывод выполнения команды был подавлен. Возможно, это побочный эффект при запуске cmd под WinXP (я использую maven-antrun-plugin). В любом случае настройка output="con" отлично сработала:

<configuration>
    <target>
        <exec executable="cmd" output="con">
            <arg value="/c" />
            <arg value="..." />
        </exec>
    </target>
</configuration>
0 голосов
/ 22 октября 2009

Может быть, вы хотите посмотреть атрибуты error, logError и errorproperty задачи exec . Они касаются обработки стандартного потока ошибок из процесса exec'd. Там может быть полезная информация, которая по какой-то причине перестает быть полезной, что может объяснять неполноту, которую вы видите.

Но, если exec'd решит закрыть stdout или stderr и отправить их в другое место - вы мало что можете сделать.

0 голосов
/ 22 октября 2009

Если вы хотите выводить данные в System.out, просто не указывайте атрибут «output». Если вы хотите перенаправить файл и распечатать его в System.out, вы можете использовать команду tee , которая перенаправит вывод в указанный файл, а также выведет его на стандартный вывод ... не знаю, поддерживает ли Windows "тройник" или его эквивалент.

...