Параметризованные цели зависит от муравья
Я работаю над сценарием сборки ant для развертывания jar-файлов. то есть просто обновить финальную / бета-версию приложения в указанной папке. Он проверяет, является ли развернутый фляга уже современным. Если да, он пропускает выполнение цели, используя флажок.
Ниже приведен фрагмент цели
<property name="deploy-dir-final" location="C:\Deploy\final" />
<property name="deploy-dir-beta" location="C:\Deploy\beta" />
<macrodef name="macro-deploy-jar">
<attribute name="deploydir" default="C:\Deploy\beta" />
<sequential>
<echo>Deploying jar</echo>
<copy overwrite="true" file="C:/project/application.jar" todir="@{deploydir}"/>
<echo>Deployed</echo>
</sequential>
</macrodef>
<target name="deploy-jar-final" depends="is-final-jar-up-to-date" unless="jar.isUpToDate">
<task-deploy-jar deploy-dir-path="${deploy-dir-final}"/>
</target>
<target name="deploy-jar-beta" depends="is-beta-jar-up-to-date" unless="jar.isBetaUpToDate">
<task-deploy-jar deploy-dir-path="${deploy-dir-beta}"/>
</target>
<target name="is-final-jar-up-to-date">
<echo message="Checking if deployed final jar is up-to-date"/>
<uptodate property="jar.isUpToDate" targetfile="${deploy-dir-final}/application.jar" >
<srcfiles dir= "${output-dir}" includes="application.jar"/>
</uptodate>
</target>
<target name="is-beta-jar-up-to-date">
<echo message="Checking if deployed beta jar is up-to-date"/>
<uptodate property="jar.isBetaUpToDate" targetfile="${deploy-dir-beta}/application.jar" >
<srcfiles dir= "${output-dir}" includes="application.jar"/>
</uptodate>
</target>
Я использовал macrodef для повторного использования кода в случае целей deploy-jar. Но перед развертыванием я проверяю, обновлен ли уже существующий jar-файл. Это делается через зависящий от цели атрибут. Но я вижу здесь также возможность повторного использования кода, поскольку он отличается только путями. Я не понял, как мы можем передать параметры в зависимости от целей.
Есть ли способ использовать что-то похожее на macrodef для повторного использования кода в этом случае? или мы можем использовать условие if для macordef, чтобы оно запускалось только в том случае, если установлено какое-либо свойство.
Или любым другим способом, которым я могу достичь того же самого без необходимости писать две цели для проверки финальной и бета-фляги, просто чтобы проверить, актуальны ли они.
1 ответ
С версией ant> 1.9.1 вы можете использовать функцию if если
Может использоваться для всех задач и вложенных элементов, также с макросами.
Несколько глупых примеров:
<project xmlns:if="ant:if">
<macrodef name="foobar">
<attribute name="foo"/>
<attribute name="verbose"/>
<sequential>
<echo>@{foo}</echo>
<echoproperties prefix="ant" if:true="@{verbose}"/>
</sequential>
</macrodef>
<foobar verbose="yes" foo="1. bla bla bla bla.."/>
<foobar verbose="no" foo="2. bla.."/>
</project>
<project
xmlns:if="ant:if"
xmlns:unless="ant:unless"
>
<property name="foobar" value=""/>
<echo if:blank="${foobar}">foobar blank !</echo>
<echo unless:blank="${foobar}">foobar not blank !</echo>
</project>