При выполнении командного файла с задачами 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=" > _tempfile.out 2<&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 & del _tempfile.out & exit /b 1)"/>
<!--Next arg: Otherwise, just type the temporary file and delete it-->
<arg line=" & type _tempfile.out & del _tempfile.out &"/>
Поскольку этот хак относится только к окнам, не забудьте добавить @osfamily="windows"
в задачу apply
или exec
. И создайте аналогичные задачи для `@ osfamily =" unix "и т. Д., Но без этих дополнительных аргументов.