При выполнении пакетного файла с задачами 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=" > _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" и т. д., но без этих дополнительных аргументов.
person
darcyparker
schedule
28.04.2012