2012-04-18 40 views
2

这个问题可能不是很清楚,所以让我举例说明我的意思。说我想复制几个文件夹:但有没有从Ant脚本中动态构建Ant元素的方法?

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

,而不是在脚本中硬编码的文件夹,我需要从看起来像这样的文本文件加载它们:

Directories to copy: 
    dir1 
    dir2 
    dir3 
    ... 

所以我以某种方式需要加载文本文件,解析它,找出应该复制哪些目录,并从它构建元素<copy><fileset>只是例子)。

是否有可能在Ant中从实现该操作,而不对我的build.xml文件执行某些转换(例如XSLT)?

+1

哇,那里,伙伴。我肯定会排除对构建文件的操纵。除了极度不可预测外,它也是不可维护的。我确定有更好的方法。现在在这些文件夹上复制文件的标准是什么? – Neil 2012-04-18 15:30:59

+0

你能修改你的文本文件的格式吗? – 2012-04-18 15:43:13

+0

@Neil Copy仅仅是一个例子(实际上我的任务是为Flex的''任务动态地构造'' @orzechowskid不,我不是 – Borek 2012-04-18 16:38:48

回答

0

我能想到的完成你想用蚂蚁做的最好的方法是使用ant contrib foreach任务来读取文件并在每一行上执行操作。 Ant目标会是这个样子:

<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> 

这将读取任何.txt文件的文件夹命名dirlists,并为每个文件的每一行由该行指定到目标目录的目录做副本...

+0

谢谢,但正如我在问题中已经注意到的''copy''和'fileset'只是一个例子,我之后是动态生成嵌套元素。多次执行相同的任务在我的情况下不起作用。 – Borek 2012-04-18 16:46:18

+0

啊,我明白了,我以前也想做同样的事情,但从来没有找到一种方法来动态地使用ant来嵌套元素 – ioscode 2012-04-18 16:58:38

2

,因为你不能够修改输入的文本文件,我能想到做你想要什么是最好的方式格式:

1.创建一个[外壳|的Perl | etc]脚本,可以从原始文件生成XML。这可以是XML的片段或完整的Ant文件。

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

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

+0

感谢包含XML实体的链接,我忘记了我可以使用这种技术,并且只查看包含任务,但是,我会在我可能很幸运 - 我需要执行的任务(Flex的'compc')实际上可以读取外部配置文件,因此ho在我来compc之前,我只需要执行文件转换任务。 – Borek 2012-04-18 17:23:33