最近のトラックバック

2021年7月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
無料ブログはココログ

« 鹿児島旅行 | トップページ | ソフトウェア開発計画 »

2006.11.27

Antとの格闘

 いま手がけている新プロジェクトで、日常的に行う作業を自動化するためにAntに乗り換えた。最初はちょろっとしたシェルスクリプトで十分だったのだけども、全体が複雑化するにつれて徐々に混乱してきたのでこの際一気に書き換え。
 作っているものはソースコード生成ツールなので、これのテストをするためにテスト用の入力でJUnitのテストケースのコードを生成し、それをjavacでコンパイルしてJUnitにかける、といった手順をしていたのだけど、ほぼ丸一日かけた結果その殆どを自動化できた。
 ただ、生成したコードにコメントが期待したとおりに埋め込まれているか、インデントが正しいかといったところまではさすがにムリなので目視確認。

 以下、Antまわりで似た問題ではまる人が多そうなのをメモ。

(1) AntからのJUnit呼び出し
 AntからJUnitを<junit>で呼び出すとき、JUnitのバージョン3の動作になる。$ANT_HOME/libにJUnit4を置いていてもだ。つまり、テストケースがJUnit4形式でAnnotationを使ってるとうまくない。そこで、テストケースのクラスに

  public static junit.framework.Test suite() {
   return new junit.framework.JUnit4TestAdapter(TestCase.class);
  }

 と書いておくとJUnit4用テストをAntから呼べるようになる。org.junit.Testとjunit.framework.Testがかぶってて単一のimportではカバーできない点に注意。

(2) applyの限界
 一連の作業の中には、C#のソースコードを生成してそれをコンパイルする必要があった。それも、複数個のファイルを入力にとってそのそれぞれに出力の.exeを用意したかった。
 filesetのそれぞれに何かを実行する機能はapplyタスクにしかないが、applyは実行するコマンドを直接指定するので、AntのCSCタスクを呼ぶわけにはいかない。ところが、cscは

csc /out:xxx.exe /main:XXX

のように、引数の先頭に"/out:"みたいなプレフィックスを要求する一方、apply下の<targetfile/>タグで指定できるのは独立した引数としてのファイル名なので解決できないのである! さらに、入力ファイル名を元に/main:xxxの部分を合成するのも(確信はないが)たぶん無理。

 これはハードル高い。applyでシェルスクリプトを呼び出す手も検討したけど、結局複数の.exeを出力するのをやめることで落ち着いた。

 Antはそれほど隅々まで知っているわけではないので別の手段があるのかもしれないけど、このあたりは機能を求めていくと汎用プログラム言語と変わらなくなっちゃうから仕方ない。makeやXSLTもそうだったしね...
 不便な点も確かにあるけど、Typeの存在(fileset, classpathなどのタグで指定するやつ)だけでもmakeよりAntを選択する価値はあると思う。

« 鹿児島旅行 | トップページ | ソフトウェア開発計画 »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: Antとの格闘:

« 鹿児島旅行 | トップページ | ソフトウェア開発計画 »