Ant (1.6.5) - Как установить два свойства в одном <condition> или <if>

StackOverflow https://stackoverflow.com/questions/1618493

Вопрос

Я пытаюсь присвоить две разные строки двум разным переменным, зависящим от двух логических значений в 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top