Как я могу генерировать цели Ant?

Я хочу иметь возможность генерировать несколько целей 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.

Как я могу сделать это?

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> задача в предпочтении <foreach>иначе у вас должна быть отдельная цель для тела цикла.
  • Создайте второй файл сборки, здесь называется mybuild.xml, чтобы содержать ваши цели.
  • Содержимое файла сборки должно быть в пределах <project> элемент.
  • Импортируйте файл сборки.

Затем вы можете вызывать цели на лету так, как вы хотите.

Вы могли бы альтернативно использовать <script> Задача создать цели, если вы предпочитаете, что избавило бы от необходимости отдельного файла сборки и импорта, примерно так:

<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>
Другие вопросы по тегам