【问题标题】:Is there a way to dynamically build Ant elements from within an Ant script?有没有办法从 Ant 脚本中动态构建 Ant 元素?
【发布时间】:2012-04-30 01:26:13
【问题描述】:

这个问题可能不是很清楚,所以让我用一个例子来说明我的意思。假设我要复制几个文件夹:

<copy todir="..." overwrite="true">
    <fileset dir="dir1" />
    <fileset dir="dir2" />
    <fileset dir="dir3" />
    ...
</copy>

但我不需要在脚本中硬编码这些文件夹,而是需要从如下所示的文本文件中加载它们:

Directories to copy:
  dir1
  dir2
  dir3
  ...

所以我以某种方式需要加载文本文件,解析它,找出应该复制哪些目录以及其中的构造元素&lt;copy&gt;&lt;fileset&gt; 只是示例)。

是否可以在 在 Ant 中 实现这一点,而无需对我的 build.xml 文件执行一些转换(例如 XSLT)?

【问题讨论】:

  • 哇,伙伴。我肯定会排除对构建文件的操作。除了极其不可预测之外,它也是不可维护的。我确定有更好的方法。现在在这些文件夹中复制文件的标准是什么?
  • 你能修改你的文本文件的格式吗?
  • @Neil Copy 只是一个示例(实际上我的任务是为 Flex 的 &lt;compc&gt; 任务动态构建 &lt;include-file&gt;s。@orzechowskid 不,我不是。

标签: ant


【解决方案1】:

由于您无法修改输入文本文件的格式,因此我能想到的最佳方法是:

1.创建一个 [shell|Perl|etc] 脚本,它从您的原始文件生成 XML。这可以是 XML 的 sn-p 或完整的 Ant 文件。

2.在调用 Ant 之前运行该脚本。

3.将生成的 XML 导入到您的 Ant 文件中(请参阅http://ant.apache.org/faq.html#xml-entity-include 上的相关 Ant 文档)。

【讨论】:

  • 感谢包含 XML 实体的链接,我忘记了我可以使用该技术并且只查看包含任务。但是,只有在可能的情况下,我才会一步一步构建我的东西。不过我可能很幸运 - 我需要执行的任务(Flex 的 compc)实际上可以读取外部配置文件,所以希望我只需要在来到 compc 之前执行文件转换任务。
【解决方案2】:

我能想到的使用 ant 完成您想要执行的操作的最佳方法是使用 ant contrib foreach 任务来读取文件并在每一行上执行操作。蚂蚁目标看起来像这样:

<taskdef resource="net/sf/antcontrib/antcontrib.properties" />
<path id="dirlists">
    <fileset dir="${basedir}/dirlists">
        <include name="**/*.txt" />
    </fileset>
</path>

<target name="runCopy">
    <foreach target="_copyDir" param="dirPath">
        <path refid="dirlists"/>
    </foreach>
</target>   

<target name="_copyDir">
    <copy todir="..." overwrite="true">
        <fileset dir="${dirPath}"/>
    </copy>
</target>

这将读取名为 dirlists 的文件夹中的任何 .txt 文件,并为每个文件中的每一行从该行指定的目录复制到目标目录...

【讨论】:

  • 谢谢,但正如我在问题中所指出的 copyfileset 只是示例,我所追求的是动态生成嵌套元素。在我的情况下,多次执行相同的任务是行不通的。
  • 啊,我明白了。我以前也想做同样的事情,但从来没有找到用 ant 动态地做嵌套元素的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-20
  • 2011-01-04
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 2011-04-30
相关资源
最近更新 更多