如何生成Ant目标?

时间:2015-03-06 20:31:46

标签: ant ant-contrib

我希望能够生成许多像这样的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 jspant js

但是,此代码失败,因为目标标记不能放在foreach标记中。

我该如何做到这一点?

1 个答案:

答案 0 :(得分:1)

您可以通过多种方式即时添加目标。这是一个建议:

<property name="mybuild" value="mybuild.xml" />

<property name="grunt_tasks" value="jsp,css,js,img" />

<echo message="&lt;project&gt;" 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="&lt;/project&gt;" 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>