我希望能够生成许多像这样的Ant目标:
<property name="grunt_tasks" value="jsp,css,js,img" />
<foreach list="${grunt_tasks}" param="task">
<target name="${task}">
<exec executable="grunt" failonerror="true">
<arg line="${task}" />
</exec>
</target>
</foreach>
允许我运行ant jsp
或ant js
。
但是,此代码失败,因为目标标记不能放在foreach标记中。
我该如何做到这一点?
答案 0 :(得分:1)
您可以通过多种方式即时添加目标。这是一个建议:
<property name="mybuild" value="mybuild.xml" />
<property name="grunt_tasks" value="jsp,css,js,img" />
<echo message="<project>" file="${mybuild}" />
<for list="${grunt_tasks}" param="task">
<sequential>
<echo file="${mybuild}" append="yes"><![CDATA[
<target name="@{task}">
<exec executable="grunt" failonerror="true">
<arg line="@{task}" />
</exec>
</target>
]]></echo>
</sequential>
</for>
<echo message="</project>" file="${mybuild}" append="yes"/>
<import file="${mybuild}" />
说明:
<for>
task <foreach>
,否则您必须为循环体提供单独的目标。mybuild.xml
,以包含您的目标。<project>
元素内。然后,您可以按照自己的方式调用即时目标。
如果您愿意,也可以使用<script>
task创建目标,这样就不需要单独的构建文件和导入,如下所示:
<for list="${grunt_tasks}" param="task">
<sequential>
<script language="javascript"><![CDATA[
importClass(org.apache.tools.ant.Target);
var exec = project.createTask( "exec" );
exec.setExecutable( "grunt" );
exec.setFailonerror( true );
var arg = exec.createArg( );
arg.setValue( "@{task}" );
var target = new Target();
target.addTask( exec );
target.setName( "@{task}" );
project.addOrReplaceTarget( target );
]]></script>
</sequential>
</for>