3

我有一个 ant 任务,它使用应用任务在一组文件上运行脚本。

我有一个这样的目录结构: mkdir -p a/{b,c,d,e}/f

通常(如果我不传递任何参数),我希望 ant 在所有fs 上运行。也就是说,如果我调用ant mytask,它应该处理:a/b/f, a/c/f, a/d/f, a/e/f。这已经使用应用和模式集工作。

但是,当我向它传递一个名为 的可选参数时foo,它应该只在a/foo/f.

所以如果我打电话ant mytask -foo b,它应该a/b/f只处理,而不是其他人。

我已经阅读了这篇 SO 帖子,其中解释了传递参数的方式,并且我查看了有关propertiesconditionals的 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:在我的实际代码中,我使用模式集而不是 dirset,但它的工作方式应该相同。

注意 2:在我最初的问题中,我说目录结构是a/{b,c,d,e}/f. 它实际上有点复杂,因此*在上面的包含中。我第一次忽略了它,因为它似乎不相关。

4

1 回答 1

2

您可以使用属性“覆盖”来执行此操作 - 尽管命令行语法略有不同。

首先,在构建文件中,从属性构造文件集或目录集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阻止了构建文件中的属性被使用。

于 2011-07-25T15:47:37.290 回答