Ant (1.6.5) - Как установить два свойства в одном <condition> или <if>
-
06-07-2019 - |
Вопрос
Я пытаюсь присвоить две разные строки двум разным переменным, зависящим от двух логических значений в Ant.
Псевдокод (ish):
if(condition)
if(property1 == null)
property2 = string1;
property3 = string2;
else
property2 = string2;
property3 = string1;
То, что я пробовал, это;
<if>
<and>
<not><isset property="property1"/></not>
<istrue value="${condition}" />
</and>
<then>
<property name="property2" value="string1" />
<property name="property3" value="string2" />
</then>
<else>
<property name="property2" value="string2" />
<property name="property3" value="string1" />
</else>
</if>
Но я получаю исключение нулевого указателя для строки , содержащей "<if>
".Я могу заставить это работать, используя <condition property=...>
теги, но одновременно можно задать только одно свойство.Я пробовал использовать <propertyset>
но это тоже было запрещено.
Я новичок в ant, как вы, наверное, уже догадались :).
Гэв
Решение
Есть несколько способов сделать это.Самый простой - это просто использовать два condition
заявления и воспользоваться преимуществами неизменности свойства:
<condition property="property2" value="string1">
<isset property="property1"/>
</condition>
<condition property="property3" value="string2">
<isset property="property1"/>
</condition>
<!-- Properties in ant are immutable, so the following assignments will only
take place if property1 is *not* set. -->
<property name="property2" value="string2"/>
<property name="property3" value="string1"/>
Это немного громоздко и плохо масштабируется, но всего для двух свойств я бы, вероятно, использовал этот подход.
Несколько лучший способ - использовать условную цель:
<target name="setProps" if="property1">
<property name="property2" value="string1"/>
<property name="property3" value="string2"/>
</target>
<target name="init" depends="setProps">
<!-- Properties in ant are immutable, so the following assignments will only
take place if property1 is *not* set. -->
<property name="property2" value="string2"/>
<property name="property3" value="string1"/>
<!-- Other init code -->
</target>
Здесь мы снова используем преимущество неизменности свойств.Если вы не хотите этого делать, вы можете использовать unless
атрибут и дополнительный уровень косвенности:
<target name="-set-props-if-set" if="property1">
<property name="property2" value="string1"/>
<property name="property3" value="string2"/>
</target>
<target name="-set-props-if-not-set" unless="property1">
<property name="property2" value="string2"/>
<property name="property3" value="string1"/>
</target>
<target name="setProps" depends="-set-props-if-set, -set-props-if-not-set"/>
<target name="init" depends="setProps">
<!-- Other init code -->
</target>
Важно отметить, что if
и unless
атрибуты target
проверяйте только, установлено ли свойство, а не значение свойства.
Другие советы
Вы можете использовать Муравей-Вклад библиотека, чтобы иметь доступ к аккуратному <if><then><else>
синтаксис, однако для этого потребуется несколько шагов загрузки / установки.
Смотрите этот другой вопрос SO: задача ant-contrib - if/then/else