说我需要做类似的事情:
<copy todir="${DEPLOYMENT_DIR}" overwrite="true">
<fileset dir="dir1" />
<fileset dir="dir2" />
<fileset dir="dir3" />
...
<if>
<equals arg1="${SPECIAL_BUILD}" arg2="true"/>
<then>
<fileset dir="dir7" />
<fileset dir="dir8" />
...
</then>
</if>
</copy>
(真正的任务不是复制,我只是用它来说明这一点。)
Ant会抱怨我的任务不支持嵌套的<if>
,这是公平的。我一直在思考这些问题:
我可以添加一个带有“element”属性的macrodef,如下所示:
<macrodef name="myCopy">
<element name="additional-path" />
<sequential>
<copy todir="${DEPLOYMENT_DIR}" overwrite="true">
<fileset dir="dir1" />
<fileset dir="dir2" />
<fileset dir="dir3" />
...
<additional-path/>
</copy>
</sequential>
</macrodef>
但这意味着调用者(目标)必须指定我想要避免的额外路径(如果许多目标调用此任务,则他们必须重复additional-path
元素中的文件集定义。) / p>
如何编写 macrodef中的其他文件集,以便Ant不会抱怨?
答案 0 :(得分:2)
实现这一目标的一种方式(不确定是否一个好)是创建两个宏定义 - 一个用于一般用途的“公共”和一个用于实际工作的“内部”并且仅用于从“公共”调用“宏观。像这样:
<macrodef name="task-for-public-use">
<sequential>
<if>
<equal arg1="${SPECIAL_BUILD}" arg2="true" />
<then>
<internal-task>
<additional-path>
...
</additional-path>
</internal-task>
</then>
<else>
<internal-task ... />
</else>
</if>
</sequential>
</macrodef>
<macrodef name="internal-task">
<element name="additional-path" />
<sequential>
<copy ...>
...
<additional-path/>
</copy>
</sequential>
</macrodef>
我不喜欢它,希望有更好的方法。
答案 1 :(得分:1)
AntContrib 有一个Ant FileSet object augmented with if and unless conditions。
http://ant-contrib.sourceforge.net/fileset.html
if 设置'if'条件的属性名称。文件集将是 除非属性是,否则忽略 定义。该属性的价值是 微不足道,但价值观会如此 暗示误解(“虚假”, “不”)会抛出异常 评价。
除非设置“除非”条件的属性名称。如果命名 属性设置,文件集将是 忽略。该属性的价值是 微不足道,但价值观会如此 暗示误解(“虚假”, “没有”)的行为会抛出一个 评估时的异常。
您可以像这样使用它:
<copy todir="${DEPLOYMENT_DIR}" overwrite="true">
<fileset dir="dir1" />
<fileset dir="dir2" />
<fileset dir="dir3" />
...
<fileset dir="dir7" if="SPECIAL_BUILD" />
<fileset dir="dir8" if="SPECIAL_BUILD" />
</copy>