Как я могу генерировать цели 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="<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>
задача в предпочтении<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>