我有一个 ant 任务,它使用应用任务在一组文件上运行脚本。
我有一个类似这样的目录结构:
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 的 ant 文档, 和 conditionals .但我仍然无法以有效的方式将它们拼凑在一起。
另外,我不想使用上面 SO 中要求这样的参数的建议之一:
<arg value="${arg0}"/>
<arg value="${arg1}"/>
我希望能够将其称为 ant mytask -foo valueoffoo
用于任意 foo
。
谢谢。
我在下面尝试了 martin clayton 的建议,代码如下:
<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:在我的实际代码中,我使用模式集而不是 dirset,但它应该工作相同。
注意 2:在我最初的问题中,我说目录结构是 a/{b,c,d,e}/f
。它实际上有点复杂,因此在上面的 include 中有 *
。我第一次省略了它,因为它看起来不相关。
最佳答案
您可以这样做 - 尽管命令行语法略有不同 - 使用属性“覆盖”。
首先,在构建文件中,从属性 foo
构建文件集或目录集,
像这样:
<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
的命令行定义阻止了构建文件中的那个被使用。
关于ant - 将可选路径参数传递给 ant,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6818105/