Ant マクロ(macrodef)を使う
Mavenだのsbtだのを使いつつ、Antも長年使っている。
いまさら、Antでマクロを使えることを知ったので、メモ。
MacroDef Task
プログラミング言語のマクロというと、「コピペして修正してソースコードを書く」というような手作業でやってることを、プログラミング言語の機能で、プログラムとして書くといったものだと思う。
Antのマクロもやっぱりそういうもののようだ。Antでは、マクロを記述することで、新しいタスクを定義できる。
Taskクラスを継承してクラスを実装して、taskdefで新しいタスクをつくるよりお手軽だ。targetにタスクを書いて、antcallで関数のように使うより、こっちのほうが良いときもあるんだろうな。
以下は、よくやるmkdirタスクとcopyタスクを組み合わせて、マクロによりcopy-with-mkdirというタスクを新しく定義している。
<?xml version="1.0" encoding="UTF-8"?> <project name="project" default="example"> <target name="example"> <copy-with-mkdir src.parent.dir="test-dir/copy-with-mkdir-test/src" dest.dir="test-dir/copy-with-mkdir-test/dest"> <file-lists> <include name="a/xxxx.txt"/> </file-lists> </copy-with-mkdir> </target> <macrodef name="copy-with-mkdir"> <attribute name="src.parent.dir" /> <attribute name="dest.dir" /> <element name="file-lists" /> <sequential> <mkdir dir="@{dest.dir}" /> <copy todir="@{dest.dir}" overwrite="true" preservelastmodified="true"> <fileset dir="@{src.parent.dir}"> <file-lists /> </fileset> </copy> </sequential> </macrodef> </project>
F:\Data\Eclipse\workspaces\Java\031-06_Ant>tree /F フォルダ パスの一覧 ボリューム シリアル番号は 0019F604 781F:C3ED です F:. │ .project │ build-macrodef.xml │ └─test-dir └─copy-with-mkdir-test ├─dest │ └─a │ xxxx.txt │ └─src └─a xxxx.txt yyyy.txt