2009-10-24 4 views
13

Я пытаюсь назначить две разные строки двум различным переменным, зависящим от двух булевых элементов в Ant.Ant (1.6.5) - Как установить два свойства в одном <condition> или <if>

псевдокод (МОГ):

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>, но это тоже было запрещено.

Я новичок в мураве, как вы, вероятно, догадались :).

Gav

ответ

34

Существует несколько способов сделать это. Наиболее простой является просто использовать два 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 только проверить, если свойство set, а не значение свойства.

+2

Спасибо, всесторонний ответ. – gav

+0

Только то, что мне нужно. Спасибо за то, что у вас есть Brain on Ant, еще в '09. –

1

Вы можете использовать библиотеку Ant-Contrib, чтобы иметь доступ к аккуратным синтаксису <if><then><else>, однако для этого потребуется несколько шагов загрузки/установки.

См. Этот вопрос другой вопрос: ant-contrib - if/then/else task

 Смежные вопросы

  • Нет связанных вопросов^_^