我希望能够生成一些像这样的 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 标签中。
我怎样才能做到这一点?
最佳答案
您可以通过多种方式即时添加目标。这是一个建议:
<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}" />
解释:
- 使用 antcontrib
<for>
task优于<foreach>
, 否则你必须有一个单独的循环体目标。 - 创建第二个构建文件,此处称为
mybuild.xml
, 以包含您的目标。 - 构建文件内容必须在
<project>
内元素。 - Import构建文件。
然后您可以按照您希望的方式调用动态目标。
您也可以使用 <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>
关于ant - 如何生成 Ant 目标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28907144/