将可选路径参数传递给 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 在所有 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 的东西时会发生什么? 【参考方案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的主要内容,如果未能解决你的问题,请参考以下文章

定义后无法将可选参数传递给express

是否有必要在将可选参数传递给另一个可选参数之前检查它?

将可选参数传递给 ASP.NET API 的 GET 方法

当我将可选参数传递给视图时,为啥我的 CSS 静态文件在 Django 中不起作用?

如何将可选参数传递给typescript中的回调函数

检查内部方法是不是传递了一些可选参数