Муравьиное вложенное состояние - PullRequest
0 голосов
/ 28 августа 2018

У меня есть файл ant build.xml, который содержит следующий фрагмент:

<condition property="apiUrl" value="apiUrl1">
  <and>
    <equals arg1="${area}" arg2="area1"/>
    <equals arg1="${env}" arg2="stage"/>
  </and>
</condition>
<condition property="apiUrl" value="apiUrl2">
  <and>
    <equals arg1="${area}" arg2="area1"/>
    <equals arg1="${env}" arg2="develop"/>
  </and>
</condition>

Как вы можете видеть сверху, <equals arg1="${area}" arg2="area1"/> проверяется дважды, и логика фрагмента эквивалентна псевдокоду:

if (${area} == 'area1' and ${env} == 'stage') {
  apiUrl = 'apiUrl1'
}
if (${area} == 'area1' and ${env} == 'develop') {
  apiUrl = 'apiUrl2'
}

Как я могу изменить build.xml, чтобы его логика стала следующим вложенным условием?

if (${area} == 'area1') {
  if (${env} == 'stage') {
    apiUrl = 'apiUrl1'
  }
  if (${env} == 'develop') {
    apiUrl = 'apiUrl2'
  }      
}

Моя версия муравья 1.10.3.

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Причина, по которой это кажущееся незначительным изменение может казаться таким неудобным в Ant, заключается в том, что хотя условная установка свойств просто контролируется с помощью задачи condition, условный поток логики управляется на уровне target. Таким образом, если вы хотите, чтобы определенные шаги выполнялись или были пропущены в зависимости от условия, вам нужно будет создать отдельную цель, которая сначала проверяет условие, а затем сообщает основной цели, должна ли она выполняться.

<target name="setApiUrl" depends="checkArea" if="isArea1">
    <condition property="apiUrl" value="apiUrl1">
        <equals arg1="${env}" arg2="stage"/>
    </condition>

    <condition property="apiUrl" value="apiUrl2">
        <equals arg1="${env}" arg2="develop"/>
    </condition>
</target>

<target name="checkArea">
    <condition property="isArea1">
        <equals arg1="${area}" arg2="area1"/>
    </condition>
</target>
0 голосов
/ 28 августа 2018

Вы можете достичь этого, используя script вместо condition задачи, подобной этой:

<project default="init" name="My Project">

    <property name="area" value="area1" />
    <property name="env" value="develop" />

    <target name="init">
        <script language="javascript"> 
            if (project.getProperty('area') == 'area1') {
                if (project.getProperty('env') == 'stage') {
                    project.setProperty('apiUrl', 'apiUrl1');
                }
                if (project.getProperty('env') == 'develop') {
                    project.setProperty('apiUrl', 'apiUrl2');
                }      
            }
        </script>
        <echo>${apiUrl}</echo>
    </target>

</project>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...