ant - 将可选路径参数传递给 ant

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

我有一个 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/

相关文章:

java - 使用 Ivy 和私有(private)公司存储库时,我应该把我的凭据放在哪里?

javascript - 如何在生产环境中加载 minify css

java - 在 NetBeans 8.1 中运行单个 TestNG 测试

c - 如何解析 C 中的整数命令行参数?

arrays - Postgres整数数组作为参数?

java - 运行最后一行包含 'exit' 的批处理文件后,命令提示符不关闭

c# - 在控制台应用程序中屏蔽密码参数

java - 带命令行参数的 intelliJ IDEA 运行类

c++ - 如何将类方法传递给另一个函数,就像线程构造函数中发生的那样

c++ - 传递一个函数(具有可变数量的参数!)作为参数