Как проверить, имеет ли свойство значение в Ant
У меня есть XML файл Ant, который я использую для сборки.
У меня есть 3 свойства. Я хочу разбить сборку, если эти свойства не содержат никакого значения. Также я хочу разбить сборку, если значение пусто.
Как это сделать в Ant?
Я использую Ant, а не Ant -contrib.
Ответы
Ответ 1
Вы можете использовать условия, используя задачу <fail>
:
<fail message="Property "foo" needs to be set to a value">
<condition>
<or>
<equals arg1="${foo}" arg2=""/>
<not>
<isset property="foo"/>
</not>
</or>
</condition>
Это эквивалентно утверждению, что if (not set ${foo} or ${foo} = "")
является псевдокодом. Вы должны прочитать условия XML изнутри.
Вы могли бы использовать предложение <unless>
в задаче <fail>
, если вы только заботились о том, была ли установлена переменная, а не то, имеет ли она фактическое значение.
<fail message="Property "foo" needs to be set"
unless="foo"/>
Однако это не сработает, если свойство установлено, но не имеет значения.
Вот трюк, который может сделать этот простой
<!-- Won't change the value of `${foo}` if it already defined -->
<property name="foo" value=""/>
<fail message="Property "foo" has no value">
<condition>
<equals arg1="${foo}" arg2=""/>
</condition>
</fail>
Помните, что я не могу reset свойство! Если ${foo}
уже имеет значение, задача <property>
выше ничего не сделает. Таким образом, я могу исключить условие <isset>
. Это может быть хорошо, поскольку у вас есть три свойства:
<property name="foo" value=""/>
<property name="bar" value=""/>
<property name="fubar" value=""/>
<fail message="You broke the build, you dufus">
<condition>
<or>
<equals arg1="${foo}" arg2=""/>
<equals arg1="${bar}" arg2=""/>
<equals arg1="${fubar}" arg2=""/>
</or>
</condition>
</fail>
Ответ 2
Основываясь на других ответах, это моя предпочтительная форма, как макрос:
<!-- Macro to require a property is not blank -->
<macrodef name="prop-require">
<attribute name="prop"/>
<sequential>
<fail message="Property "@{prop}" must be set">
<condition>
<not>
<isset property="@{prop}"/>
</not>
</condition>
</fail>
<fail message="Property "@{prop}" must not be empty">
<condition>
<equals arg1="${@{prop}}" arg2=""/>
</condition>
</fail>
</sequential>
</macrodef>
Используется как:
<target name="deploy.war" description="Do the war deployment ;)">
<prop-require prop="target.vm" />
<prop-require prop="target.vip" />
<!-- ... -->
Для краткости вы можете свернуть два элемента fail в одном, используя <or>
, но я предпочитаю, чтобы мои сообщения об ошибках обрабатывали меня, как я не могу думать для себя;)
Ответ 3
Вы можете попробовать использовать условия... или создать цель с если
Ответ 4
С Ant addon Flaka вы можете использовать такие шаблоны, как:
<property name="foo" value="bar"/>
...
<fl:unless test="has.property.foo">
...
</fl:unless>
...
<fl:when test="has.property.foo">
...
</fl:when>
Проверка бетона на пустоты:
<fl:when test=" empty '${foo}' ">
<fail message="Houston we have a problem!!"/>
</fl:when>
Полный пример, также используя некоторую проверку равенств с помощью 'eq' (противоположным будет "neq" ):
<project xmlns:fl="antlib:it.haefelinger.flaka">
<!-- some if/then/else construct -->
<fl:choose>
<!-- if -->
<when test=" '${buildtype}' eq 'prod' ">
<!-- then -->
<echo>..starting ProductionBuild</echo>
</when>
<when test=" '${buildtype}' eq 'test' ">
<!-- then -->
<echo>..starting TestBuild</echo>
</when>
<!-- else -->
<otherwise>
<fl:unless test="has.property.dummybuild">
<fail message="No valid buildtype !, found => '${buildtype}'"/>
</fl:unless>
<echo>.. is DummyBuild</echo>
</otherwise>
</fl:choose>
</project>
с ant -f build.xml -Dbuildtype = prod
или
ant -f build.xml -Dbuildtype = prod -Ddummybuild = whatever
[echo] ..starting ProductionBuild
вывод с typo = > ant - build.xml -Dbuildtype = testt
BUILD FAILED
/home/rosebud/workspace/AntTest/build.xml:21: No valid buildtype !, found => 'testt'
с ant -f build.xml -Ddummybuild = whatever
[echo] .. is DummyBuild
Ответ 5
Я на старой версии Ant, поэтому isset не был доступен. Вместо этого я использовал следующие обозначения с двойным $в равных.
<target name="xxx">
<echo message="${contextRoot}" />
<if>
<!-- check if the contextRoot property is defined. -->
<equals arg1="${contextRoot}" arg2="$${contextRoot}" />
<then>
<!-- it isn't set, set a default -->
<property name="contextRoot" value="/WebAppCtx" />
</then>
</if>
<echo message="${contextRoot}" />
</target>