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>


上のbuild.xmlをテストしたときのディレクトリ構成

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