我想从一个Ant构建文件中为一个目录中的每个文件执行一个命令。
我正在寻找一个独立于平台的解决方案。
我该怎么做呢?
当然,我可以用某种脚本语言编写脚本,但这会进一步增加项目的依赖性。
发布于 2009-09-23 19:17:19
简短的回答
对嵌套的<FileSet>
使用<foreach>
Foreach需要ant-contrib。
更新了最近的ant-contrib示例:
<target name="foo">
<foreach target="bar" param="theFile">
<fileset dir="${server.src}" casesensitive="yes">
<include name="**/*.java"/>
<exclude name="**/*Test*"/>
</fileset>
</foreach>
</target>
<target name="bar">
<echo message="${theFile}"/>
</target>
这将使用导致当前文件的${theFile}反调用目标"bar“。
发布于 2010-10-26 17:47:25
使用 task。
它为每个文件执行一次命令。通过文件集或任何其他资源指定文件。是内置的;不需要额外的依赖;不需要自定义任务实现。
也可以只运行该命令一次,将所有文件作为参数一次性附加。使用parallel属性切换行为。
对不起,我迟到了一年。
发布于 2012-03-15 14:43:50
以下是使用javascript和ant scriptdef任务完成此任务的方法,因为scriptdef是一个核心ant任务,所以您不需要ant-contrib就可以让此代码工作。
<scriptdef name="bzip2-files" language="javascript">
<element name="fileset" type="fileset"/>
<![CDATA[
importClass(java.io.File);
filesets = elements.get("fileset");
for (i = 0; i < filesets.size(); ++i) {
fileset = filesets.get(i);
scanner = fileset.getDirectoryScanner(project);
scanner.scan();
files = scanner.getIncludedFiles();
for( j=0; j < files.length; j++) {
var basedir = fileset.getDir(project);
var filename = files[j];
var src = new File(basedir, filename);
var dest= new File(basedir, filename + ".bz2");
bzip2 = self.project.createTask("bzip2");
bzip2.setSrc( src);
bzip2.setDestfile(dest );
bzip2.execute();
}
}
]]>
</scriptdef>
<bzip2-files>
<fileset id="test" dir="upstream/classpath/jars/development">
<include name="**/*.jar" />
</fileset>
</bzip2-files>
https://stackoverflow.com/questions/1467991
复制相似问题