将可选路径参数传递给 ant
Posted
技术标签:
【中文标题】将可选路径参数传递给 ant【英文标题】:Passing optional path arguments to ant 【发布时间】:2011-10-12 16:25:43 【问题描述】:我有一个 ant 任务,它使用 apply 任务在一组文件上运行脚本。
我有一个这样的目录结构:
mkdir -p a/b,c,d,e/f
通常(如果我不传递任何参数),我希望 ant 在所有 f
s 上运行。
也就是说,如果我调用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
的东西时会发生什么?
【参考方案1】:
您可以这样做——尽管命令行语法略有不同—— 使用属性“覆盖”。
首先,在构建文件中,从属性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的主要内容,如果未能解决你的问题,请参考以下文章