【发布时间】:2011-10-12 16:25:43
【问题描述】:
我有一个 ant 任务,它使用 apply 任务在一组文件上运行脚本。
我有一个这样的目录结构:
mkdir -p a/{b,c,d,e}/f
通常(如果我不传递任何参数),我希望 ant 在所有 fs 上运行。
也就是说,如果我调用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}"/>
对于任意的foo,我希望能够将其称为ant mytask -foo valueoffoo。
谢谢。
我在下面尝试了马丁·克莱顿的建议,代码如下:
<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。它实际上有点复杂,因此上面包含的 * 。我第一次省略了,因为它似乎不相关。
【问题讨论】:
-
我不确定我是否遵循这个 - 你的示例 Ant 命令行提到了一个目标
mytask和一个任意的foo,但你的示例构建文件是针对一个名为 foo 的目标?您是否需要传入任意子路径?还是只是一个任意目录级别? -
@martin Clayton:哦,对不起,你说得对,这令人困惑。我解决了我的问题。
-
因此,默认情况下,包含模式是
*/*/f- 您希望能够从命令行覆盖其中的哪些部分?${foo}部分,或中间*- 或两者兼而有之? -
好吧,大概如果我学会做 ${foo} 部分,如果我以后需要中间部分,我可以适应它。现在虽然它只是 ${foo}。我猜我是否需要两个属性都可以设置为 value="/" 或者我可以将两个属性设置为 *. (如果这句话没有意义,忽略它,不要太相关)。
-
那么当你使用上面的构建文件运行类似
ant -Dfoo=d的东西时会发生什么?
标签: ant command-line-arguments argument-passing optional-arguments