Ant - 如果条件 - 从外部数组/文件读取并将其与第一个arg进行比较

时间:2018-02-15 08:53:16

标签: java ant

我正在尝试使用ant来构建有关各种条件的结构。 我想根据他们属于哪个大陆,为地球和大陆的所有国家采取行动

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

现在,如果您可以想象有超过200个国家+我想使用NOT,AND和OR条件也会导致语言非常庞大,以后很难修改和维护。 有没有办法通过将所有国家/地区排序为文件中的数组或列表并让ant从此文件中读取来最小化代码。 外部文件:

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

然后使用这样的ant非常简单:

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

我的问题不是如何在ant中加载或读取属性文件,而是如何从数组或列表中读取值

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

其中&#34;亚洲&#34;是数组(或列表)和问题,如果第一个arg等于该数组的任何值,是否有可能在蚂蚁中实现IF条件如此?或者即使有更好的方法来完成这项任务。

2 个答案:

答案 0 :(得分:1)

Ant属性总是字符串,因此无法真正存储或读取数组(或任何其他类型的对象)。

幸运的是,对于您的问题,国家/地区缩写始终以唯一的双字母字符串形式出现,因此只需从存储为一个长字符串的逗号分隔列表中读取它们即可轻松可靠地完成。

如果可能的话,我建议完全放弃ant-contrib。有时你会有一个需要for循环的脚本,并且除此之外没有别的办法,但如果你只是处理一堆条件,那么它就是一个问题。更好的做法是使用本机Ant。如果你有点好奇,我可以进一步详细说明。

关于是否应将国家/地区信息分组到构建脚本或属性文件中的问题,这只是一个选择问题。我个人更喜欢将数据存储在属性文件中,只留下脚本本身的逻辑。

  

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 :(得分:0)

在询问并重新思考之后,我发现最好的方法是创建新的属性文件,并在其中添加蚂蚁脚本中属性文件的加载值。 而不是使用“equals arg”条件我使用“包含子串”

continent.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",....

Ant脚本

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