Ant (1.6.5) - Como definir duas propriedades em um ou
-
06-07-2019 - |
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
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