【问题标题】:How can I generate Ant targets?如何生成 Ant 目标?
【发布时间】:2015-03-06 20:31:46
【问题描述】:

我希望能够生成一些类似这样的 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 标记中。

我怎样才能做到这一点?

【问题讨论】:

    标签: ant ant-contrib


    【解决方案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 &lt;for&gt; task 而不是 &lt;foreach&gt;,否则您必须为循环体设置单独的目标。
    • 创建第二个构建文件,此处称为 mybuild.xml,以包含您的目标。
    • 构建文件内容必须在 &lt;project&gt; 元素内。
    • Import 构建文件。

    然后您可以按照您希望的方式调用动态目标。

    如果您愿意,也可以使用&lt;script&gt; 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>
    

    【讨论】:

    • 我并不热衷于生成另一个 xml 文件来完成此操作。我想我宁愿在我的 build.xml 中重复一些。我查看了脚本任务,但未能找到任何说明我将如何创建目标的文档。
    • @Matthew 添加了脚本方法。使用 API 的文档是源本身。 grepcode 是一种阅读方式。
    • 我在此过程中学到的一些东西 - load('nashorn:mozilla_compat.js'); // 因为我在 Java 8 上并使用 importClass,换句话说,Rhino 兼容性 exec.createArg( ).setValue( "--target_env=" + target_env ); // 出于某种原因,虽然任务参数不是,但 js 可以直接使用 ant 属性。 ug,格式化不是我的强项
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 2010-12-02
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多