iva*_*off 95 ant build-automation file-io build-process
我想从Ant构建文件中为目录中的每个文件执行一个命令.
我正在寻找一个独立于平台的解决方案.
我该怎么做呢?
当然,我可以使用某种脚本语言编写脚本,但这会为项目添加更多依赖项.
bla*_*k3r 60
使用<foreach>嵌套<FileSet>
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>
Run Code Online (Sandbox Code Playgroud)
这将使用$ {theFile}来调用目标"bar",从而生成当前文件.
Jmi*_*ini 27
Tassilo Horn提出了一种没有ant-contrib的方法(原始目标在这里)
基本上,因为没有<java>(还有?)的扩展,就像<apply> extends <exec>一样,他建议使用<apply>(当然也可以在命令行中运行java程序)
这里有一些例子:
<apply executable="java">
<arg value="-cp"/>
<arg pathref="classpath"/>
<arg value="-f"/>
<srcfile/>
<arg line="-o ${output.dir}"/>
<fileset dir="${input.dir}" includes="*.txt"/>
</apply>
Run Code Online (Sandbox Code Playgroud)
ams*_*ams 17
以下是使用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>
Run Code Online (Sandbox Code Playgroud)
Jef*_*ick 15
ant-contrib是邪恶的; 编写自定义ant任务.
ant-contrib是邪恶的,因为它试图将ant从声明式转换为命令式样式.但是xml是一种废话编程语言.
相比之下,自定义ant任务允许您使用真实IDE编写真实语言(Java),您可以在其中编写单元测试以确保您拥有所需的行为,然后在构建脚本中进行干净声明你想要的行为.
如果您关心编写可维护的ant脚本,这种咆哮才有意义.如果您不关心可维护性,请做任何有效的事情.:)
JTF
我知道这篇文章真的很老但现在有一些时间和蚂蚁版本通过那里有一种方法来做基本的蚂蚁功能,我想我应该分享它.
它是通过一个调用嵌套任务的递归宏定义完成的(甚至可以调用其他宏).唯一的约定是使用固定的变量名称(此处为元素).
<project name="iteration-test" default="execute" xmlns="antlib:org.apache.tools.ant" xmlns:if="ant:if" xmlns:unless="ant:unless">
<macrodef name="iterate">
<attribute name="list" />
<element name="call" implicit="yes" />
<sequential>
<local name="element" />
<local name="tail" />
<local name="hasMoreElements" />
<!-- unless to not get a error on empty lists -->
<loadresource property="element" unless:blank="@{list}" >
<concat>@{list}</concat>
<filterchain>
<replaceregex pattern="([^;]*).*" replace="\1" />
</filterchain>
</loadresource>
<!-- call the tasks that handle the element -->
<call />
<!-- recursion -->
<condition property="hasMoreElements">
<contains string="@{list}" substring=";" />
</condition>
<loadresource property="tail" if:true="${hasMoreElements}">
<concat>@{list}</concat>
<filterchain>
<replaceregex pattern="[^;]*;(.*)" replace="\1" />
</filterchain>
</loadresource>
<iterate list="${tail}" if:true="${hasMoreElements}">
<call />
</iterate>
</sequential>
</macrodef>
<target name="execute">
<fileset id="artifacts.fs" dir="build/lib">
<include name="*.jar" />
<include name="*.war" />
</fileset>
<pathconvert refid="artifacts.fs" property="artifacts.str" />
<echo message="$${artifacts.str}: ${artifacts.str}" />
<!-- unless is required for empty lists to not call the enclosed tasks -->
<iterate list="${artifacts.str}" unless:blank="${artifacts.str}">
<echo message="I see:" />
<echo message="${element}" />
</iterate>
<!-- local variable is now empty -->
<echo message="${element}" />
</target>
</project>
Run Code Online (Sandbox Code Playgroud)
所需的主要功能包括:
我没有设法制作分隔符变量,但这可能不是一个主要的缺点.
| 归档时间: |
|
| 查看次数: |
125692 次 |
| 最近记录: |