将可选路径参数传递给ant

时间:2011-07-25 15:00:24

标签: ant command-line-arguments argument-passing optional-arguments

我有一个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,其中介绍了传递参数的方法,并查看了有关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:在我的实际代码中,我使用的是patternset而不是dirset,但它的工作方式应该相同。

注2:在我原来的问题中,我说目录结构是a/{b,c,d,e}/f。事实上它有点复杂,因此上面包含的*。我第一次省略了,因为它似乎没有相关性。

1 个答案:

答案 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的命令行定义会阻止使用构建文件中的那个。