Estoy tratando de usar ant para construir una estructura con respecto a varias condiciones. Quiero actuar por todos los países de la tierra y continente según a qué continente pertenecen

<if>
      <or>
          <equals arg1="${country}" arg2="US" />
          <equals arg1="${country}" arg2="CA" />
       </or>
    <then>
        <!-- do stuff -->
    </then>
    <elseif>
        <or>
          <equals arg1="${country}" arg2="DE" />
          <equals arg1="${country}" arg2="AT" />
          <equals arg1="${country}" arg2="FR" />
          <equals arg1="${country}" arg2="NL" />
          <equals arg1="${country}" arg2="SE" />
          <equals arg1="${country}" arg2="ES" />
          ..
       </or>
    <then>
        <!-- do stuff -->
    </then>
    </elseif>
    <elseif>
        <or>
          <equals arg1="${country}" arg2="JP" />
          <equals arg1="${country}" arg2="KR" />
          <equals arg1="${country}" arg2="AU" />
          <equals arg1="${country}" arg2="SA" />
          <equals arg1="${country}" arg2="PL" />
          <equals arg1="${country}" arg2="CN" />
          ..
       </or>
    <then>
        <!-- do stuff -->
    </then>
    </elseif>
</if>

Ahora, si puedes imaginar que hay más de 200 países, quiero usar las condiciones NOT, AND y OR también para los idiomas que darán lugar a un archivo muy grande que será muy difícil de modificar y mantener más adelante. ¿Hay alguna forma de minimizar el código ordenando todos los países como matriz o lista en el archivo y dejando que la hormiga lea este archivo? Archivo externo:

North_America=["US","CA"]
Europe=["DE","GB","FR",...]
Asia=["JP","PL","CN",..]
AFRICA=[..]
South_America[..]

Entonces será muy sencillo usar ant así:

<if>
      <equals arg1="${country}" arg2="${North_America}" />
    <then>
        <!-- do stuff -->
    </then>
    <elseif>
          <equals arg1="${country}" arg2="${Asia}" />
    <then>
        <!-- do stuff -->
    </then>
    </elseif>
    <elseif>
        <equals arg1="${country}" arg2="${Africa}" />
    <then>
        <!-- do stuff -->
    </then>
    </elseif>
..
</if>

Mi problema no es cómo cargar o leer el archivo de propiedades en ant, sino cómo leer el valor de una matriz o lista

<equals arg1="${country}" arg2="${Asia}" />

¿Dónde "Asia" es matriz (o lista) y la pregunta si es posible que sea posible lograr la condición IF como esta si el primer argumento es igual a cualquier valor de esa matriz? O incluso si hubiera una mejor manera de lograr esta tarea.

0
R.Almoued 15 feb. 2018 a las 11:53

2 respuestas

La mejor respuesta

Las propiedades de las hormigas son siempre cadenas, por lo que no hay forma de almacenar o leer realmente matrices (o cualquier otro tipo de objeto).

Afortunadamente para su problema, las abreviaturas de países siempre vienen en forma de cadenas únicas de 2 letras, por lo que simplemente leerlas de una lista delimitada por comas almacenada como una cadena larga se puede hacer de manera fácil y confiable.

Recomiendo deshacerse de ant-contrib por completo, si es posible. A veces tendrás un script que requiere un bucle for y realmente no hay otra forma de evitarlo, pero si solo estás tratando con un montón de condicionales, es una mejor práctica usar Ant nativo. Puedo dar más detalles sobre esto si tienes curiosidad.

Con respecto a la cuestión de si la información del país debe agruparse en su script de construcción o en un archivo de propiedades, es solo una cuestión de elección. Personalmente, prefiero almacenar datos en archivos de propiedades, dejando solo lógica dentro del propio script.

continents.properties

continent_southAmerica=AR,BR
continent_NorthAmerica=US,CA
continent_Asia=PL,SY,JP,SA,CN
continent_Africa=EG,TU,SU,MR,Ly
continent_Europe=FR,Nl,DE,DK,GB

build.xml

<fail message="Please specify a country. (-Dcountry=US)">
    <condition>
        <not>
            <isset property="country" />
        </not>
    </condition>
</fail>

<property file="continents.properties" />

<target
    name="build"
    depends="
        north-america-stuff,
        south-america-stuff,
        asia-stuff,
        africa-stuff,
        europe-stuff"
>
    <echo message="Build complete for ${country}, ${continent}." />
</target>

<target name="init-continent">
    <condition property="continent.is.north.america">
        <contains string="${continent_NorthAmerica}" substring="${country}" />
    </condition>

    <condition property="continent.is.south.america">
        <contains string="${continent_SouthAmerica}" substring="${country}" />
    </condition>

    <condition property="continent.is.asia">
        <contains string="${continent_Asia}" substring="${country}" />
    </condition>

    <condition property="continent.is.africa">
        <contains string="${continent_Africa}" substring="${country}" />
    </condition>

    <condition property="continent.is.europe">
        <contains string="${continent_Europe}" substring="${country}" />
    </condition>
</target>

<target name="north-america-stuff" if="continent.is.north.america" depends="init-continent">
    <property name="continent" value="North America" />

    <echo message="Continent: ${continent}" />
</target>

<target name="south-america-stuff" if="continent.is.south.america" depends="init-continent">
    <property name="continent" value="South America" />

    <echo message="Continent: ${continent}" />
</target>

<target name="asia-stuff" if="continent.is.asia" depends="init-continent">
    <property name="continent" value="Asia" />

    <echo message="Continent: ${continent}" />
</target>

<target name="africa-stuff" if="continent.is.africa" depends="init-continent">
    <property name="continent" value="Africa" />

    <echo message="Continent: ${continent}" />
</target>

<target name="europe-stuff" if="continent.is.europe" depends="init-continent">
    <property name="continent" value="Europe" />

    <echo message="Continent: ${continent}" />
</target>
1
CAustin 15 feb. 2018 a las 19:11

Bueno, después de preguntar y repensar, encontré que lo mejor es crear un nuevo archivo de propiedades y agregar el valor en la carga de ese archivo de propiedades en el script ant. también en lugar de usar la condición "igual a arg" usé "Contiene subcadena"

Archivo continente.properties

continent_southAmerica="AR", "BR"...
continent_NorthAmerica="US", "CA"
continent_Asia="PL", "SY", "JP", "SA", "CN",....
continent_Africa="EG", "TU", "SU", "MR", "Ly",....
continent_Europe="FR", "Nl", "DE", "DK", "GB",....

Guión de hormiga

  <!-- load continent.properties file -->
    <loadproperties srcfile="../${continent.properties}" encoding="UTF-8">
        <filterchain>
            <escapeunicode />
        </filterchain>
    </loadproperties>

  <if>
      <contains string="${continent_southAmerica}" substring="${country}" />
    <then>
        <!-- do stuff -->
    </then>
    <elseif>
          <contains string="${continent_Asia}" substring="${country}" />
    <then>
        <!-- do stuff -->
    </then>
    </elseif>
    <elseif>
        <contains string="${continent_Europe}" substring="${country}" />
    <then>
        <!-- do stuff -->
    </then>
    </elseif>
     ..
  </if>
0
R.Almoued 15 feb. 2018 a las 14:33