Когда я работаю, или в теге муравей мультиплексирует журналы, смешивающие вывод каждой задачи. Я хотел бы что-то более легко read/grokked.
Я попробовал следующие подходы, и они лучше чем ничего, но все еще что я ищу. Следующий echos нечередующийся вывод журнала в конце журнала, но это также имеет объединенный и смешанный вывод этих двух задач сначала.
Существует ли способ, которым я могу сказать муравью ТОЛЬКО вывод в рассматриваемый файл и не пузырюсь вывод журнала вызывающей стороне?
<parallel>
<ant target="task1" output=${log.dir}/task1.log"/>
<ant target="task2" output=${log.dir}/task2.log"/>
</parallel>
<loadfile property="task1" srcfile="${log.dir}/task1.log"/>
<loadfile property="task2" srcfile="${log.dir}/task2.log"/>
<echo>Results:
Task1: ${task1}
---
Task2: ${task2}
</echo>
У меня есть два возможных решения:
Я собираюсь использовать вторую, потому что ее проще всего реализовать, и потому что я, вероятно, перехожу в Gradle позже, где я решу это другим способом (но, вероятно, следуя аналогичной схеме)
Основная задача ant будет использовать запись для включения и выключения записи в build.log. Перед параллельным он отключит ведение журнала и позволит подчиненному муравью регистрироваться в файлах. После того, как они завершатся, ant загрузится и отобразит вывод. Вывод консоли продолжает смешиваться, а файл build.log сериализуется.
Это немного странно, но не так уж плохо.
<project name="antExperiments" default="para" basedir=".">
<!-- Logging Control -->
<property name="build.log.dir" location="${basedir}/logs"/>
<!-- - - - - - - - - - - - - - - - - -
macro: activate logging (defaults to ${build.log.dir}/build.log)
- - - - - - - - - - - - - - - - - -->
<macrodef name="start.log">
<attribute name="name" default="build"/>
<attribute name="dir" default="${build.log.dir}"/>
<attribute name="append" default="false"/>
<sequential>
<record action="start" append="@{append}" name="@{dir}/@{name}.log"/>
</sequential>
</macrodef>
<!-- - - - - - - - - - - - - - - - - -
macro: deactivate logging (defaults to ${build.log.dir}/build.log)
- - - - - - - - - - - - - - - - - -->
<macrodef name="stop.log">
<attribute name="name" default="build"/>
<attribute name="dir" default="${build.log.dir}"/>
<attribute name="append" default="false"/>
<sequential>
<record action="stop" append="@{append}" name="@{dir}/@{name}.log"/>
</sequential>
</macrodef>
<target name="clean">
<delete dir="${build.log.dir}"/>
<mkdir dir="${build.log.dir}"/>
</target>
<!-- - - - - - - - - - - - - - - - - -
target: main.init
Initialization for Top Level build - not used by subants
- - - - - - - - - - - - - - - - - -->
<target name="main.init">
<start.log/>
</target>
<!-- =================================
target: para
top level build runs 2 jobs in parallel producing interleaved hard to read
on to standard output and non interleaved more easily understood logging
to build.log
================================= -->
<target name="para" depends="main.init,clean">
<stop.log/> <!-- disable top level logging -->
<parallel threadcount="4" pollinterval="50">
<ant output="${build.log.dir}/proc1.log" target="proc1">
<property name="proc" value="proc1"/>
</ant>
<ant output="${build.log.dir}/proc2.log" target="proc2">
<property name="proc" value="proc2"/>
</ant>
</parallel>
<start.log/> <!-- enable top level logging -->
<!-- Non interleaved output -->
<loadfile property="p1" srcfile="${build.log.dir}/proc1.log"/>
<loadfile property="p2" srcfile="${build.log.dir}/proc2.log"/>
<echo>
--------------------------
BuildJob: proc1
OUTPUT: ******************
${p1}
**************************
--------------------------
BuildJob: proc2
OUTPUT: ******************
${p2}
**************************
BUILD LOG: ${build.log.dir}/build.log
</echo>
</target>
<target name="init">
<echo>Init called by ${proc}</echo>
</target>
<target name="proc1" depends="init">
<echo>PROC1.......................
</echo>
<exec dir="${basedir}" executable="cmd">
<arg line="/c dir \"/>
</exec>
</target>
<target name="proc2" depends="init">
<echo>PROC2..........2222222.......
</echo>
<exec dir="${basedir}" executable="cmd">
<arg line="/c dir \sandbox"/>
</exec>
</target>
</project>