Подтвердить что ты не робот

Как я могу обеспечить, чтобы все выходные данные из Ant exec выполнялись в stdout?

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

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

4b9b3361

Ответ 1

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

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

Решение, с которым я столкнулся (взломать), состоит в том, чтобы добавить эти аргументы в конец команды:

<!--Next arg: forces node 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" и т.д., Но без этих дополнительных аргументов.

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

Работа с Ant и Gruntjs:

Для тех, кто пытается заставить это работать с помощью Gruntjs. Я смог заставить его работать, выполняя следующие действия (в сочетании с ответом darcyparker).

В моем файле Ant Build:

<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 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), который выводит трассировку стека из этой конкретной задачи. Затем это дало бы мне стек выполнения grunt, откуда бы я ни называл my Ant target.

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

Ответ 7

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

Просто добавлено /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>