我有一个ant任务,它使用apply任务在一组文件上运行脚本。
我有一个像这样的目录结构:
mkdir -p a/{b,c,d,e}/f
通常(如果我没有传递任何参数),我希望ant能够在所有f
上运行。
也就是说,如果我调用ant mytask
,它应该处理:a/b/f, a/c/f, a/d/f, a/e/f
。这已经可以使用apply和patternsets。
但是,当我传递一个名为foo
的可选参数时,它应该只调用a/foo/f
上的脚本。
因此,如果我致电ant mytask -foo b
,则应仅处理a/b/f
,而不应处理其他人。
我已阅读this SO post,其中介绍了传递参数的方法,并查看了有关properties和conditionals的ant文档。但我仍然无法以一种有效的方式将它们拼凑在一起。
此外,我不想使用上述SO中的一个建议来调用这样的参数:
<arg value="${arg0}"/>
<arg value="${arg1}"/>
我希望能够将ant mytask -foo valueoffoo
称为任意foo
。
感谢。
我在下面尝试了马丁克莱顿的建议,并且代码如下:
<target name="mytask">
<property name="foo" value="*" />
<apply executable="perl">
<arg value="somescript"/>
<dirset id="them" dir="a">
<include name="${foo}/*/f" />
</dirset>
</apply>
</target>
以上就是我想要的。
注1:在我的实际代码中,我使用的是patternset而不是dirset,但它的工作方式应该相同。
注2:在我原来的问题中,我说目录结构是a/{b,c,d,e}/f
。事实上它有点复杂,因此上面包含的*
。我第一次省略了,因为它似乎没有相关性。
答案 0 :(得分:2)
你可以这样做 - 尽管命令行语法略有不同 - 使用属性'覆盖'。
首先,在构建文件中,从属性foo
构造文件集或dirset,
像这样的东西:
<property name="foo" value="*" />
<dirset id="them" dir="a">
<include name="${foo}/f" />
</dirset>
这将为您提供默认行为 - 处理所有内容
a
的子目录,它们本身具有子目录f
。
现在,如果您像这样运行Ant:
ant -Dfoo=d
仅处理目录a/d/f
。
这是有效的,因为Ant属性不可变 - 好吧,通常不是 -
因此foo
的命令行定义会阻止使用构建文件中的那个。