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

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

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


person Geo    schedule 21.10.2009    source источник


Ответы (7)


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

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

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

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

person darcyparker    schedule 28.04.2012

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

person Jonathan Feinberg    schedule 21.10.2009
comment
Отдача муравья на выходе - это не полная продукция. Если я перенаправляю его в файл, я получаю совершенно другое. - person Geo; 22.10.2009
comment
Это справедливо для unix-систем. Но в системах Windows, если вы вызываете пакетный файл, который, в свою очередь, вызывает другие команды (например, node.exe), то stdout и stderror из дочернего процесса node.exe теряются. См. хак, который я описываю как ответ, если вы используете Windows и у вас возникла эта проблема. - person darcyparker; 28.04.2012

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

person Michael Aaron Safyan    schedule 21.10.2009

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

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

person martin clayton    schedule 21.10.2009

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

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

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

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

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

person Kris Hollenbeck    schedule 17.04.2015

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

Просто добавил /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>
person Gargaroz    schedule 17.04.2015