Pergunta

Eu estou tentando atribuir duas cordas diferentes para duas variáveis ??diferentes dependentes de dois booleans em Ant.

Pseudocódigo (ish):

if(condition)
   if(property1 == null)
      property2 = string1;
      property3 = string2;
   else
      property2 = string2;
      property3 = string1;

O que eu tentei é;

<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>

Mas eu recebo uma exceção de ponteiro nulo para a linha que contém "<if>". Eu posso fazê-lo funcionar usando tags <condition property=...> mas só pode definir uma propriedade de cada vez. Eu tentei usar <propertyset> mas isso não foi permitido.

Eu sou novo para ant como você vai provavelmente ter adivinhado:)

.

Gav

Foi útil?

Solução

Existem várias maneiras de fazer isso. O mais simples é usar apenas duas declarações condition, e tirar proveito de imutabilidade propriedade:

<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"/>

Isto é um pouco complicado e não escala bem, mas por apenas duas propriedades eu provavelmente usar essa abordagem.

Um pouco melhor maneira é usar um alvo condicional:

<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>

Estamos novamente aproveitando imutabilidade propriedade aqui. Se você não quiser fazer isso, você pode usar o atributo unless, e um nível extra de indireção:

<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>

É importante notar que o if e unless atributos de target só verificar se a propriedade é definida, e não o valor da propriedade.

Outras dicas

Você pode usar Ant-Contrib biblioteca ter acesso a uma sintaxe <if><then><else> puro, no entanto, vai exigir um download de alguns / instalar etapas.

Veja esta outra questão SO: ant-contrib - if / then / else tarefa

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top