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を使う人のほうが多いだろうということを予想しつつもこんなエントリを書いてみました。こういうことって達人プログラマーにも書いてあった気がする。