spawn=true
例えばAntの中からTomcatを起動したい。execタスクを使ってstartup.batとかstartup.shを実行すればいいっちゃいいんですが、そのままだとAntの中のプロセスとして起動(という考え方でいいんだろうか?)で起動しちゃうので、Tomcatが終了するまでAntのプロセスが終了しない(!?)
そういうときに指定汁のがspawn=trueらしい。spawnは和訳すると"産卵"。子供を生むのか。なるほど。
Execタスクとかいたけど、javaタスクとかでもforkしたときどうするのか、でspawnを使うことができるらしいよ。
http://ant.apache.org/manual/CoreTasks/java.html
targetのdepends属性はよく考えて使う
targetで指定できるdepends属性ですが、前提条件として実行しておきたいタスクを指定しておくためのものとしてよくつかわれていますよね。タスクをまとめて実行するのには便利と言えば便利ですが、antcallで一つ一つ指定しておいたほうが使いやすかったりします。実行するtargetはantの実行時に指定できるので、ビルドプロセスの途中から実行することもできます。しかし実行するtargetにdepends属性が指定されていると、結局途中まで実行された結果を捨てて、もう一度SCMからソースを取得したりとか、まどろっこしい事になることが多いのではないでしょうか。特にAntスクリプトを書いて、スクリプト自身をデバッグしているような状況ではフィードバックが遅くなるような状況は、ぜひとも避けたい。なので、depends属性で指定するくらいだったら、一つ一つtargetを指定して実行するような、テンプレートとして実行できるtargetを別途用意しておくといいです。
具体的に書くと、
<target name="all" depends="init,build,test,deploy"> </target> <target name="init"> プロジェクトの初期化処理... </target> <target name="build" depends="init"> <echo message="buiild start"/> <javac ...> ... </target>
じゃなくて、
<target name="all"> <echo message="Project build start."/> <antcall target="init"/> <antcall target="build"/> <antcall target="test"/> <antcall target="deploy"/> <echo message="Project build end."/> </target> <target name="init"> プロジェクトの初期化処理... </target> <target name="build"> <echo message="buiild start"/> ビルド処理 <javac ...> ... </target>
こうやって書いてみてわかったんですが、antcallで呼び出す形にしておくと、間に全然別のタスクを挟むことができますね。たとえば途中経過としての時間出力をallターゲットにだけ埋め込んでおくとか…。まぁ、Webアプリケーション開発が全盛のこの時代、mavenを使う人のほうが多いだろうということを予想しつつもこんなエントリを書いてみました。こういうことって達人プログラマーにも書いてあった気がする。