Подтвердить что ты не робот

Выполнять задачу Ant, только если выполнено условие

Мне нужно выполнить задачу Ant в пределах определенной цели, только если выполнено условие.

Я нашел способ определить условие на целевом уровне, но не на уровне задачи. Я также нашел вклад, который реализует задачу IF.

Мой вопрос: знаете ли вы о каком-либо способе достижения этой цели со стандартными задачами Ant?

Более длинное объяснение: я пытаюсь запустить Tomcat Server в случае его остановки. Чтобы определить, остановлен ли он, я использую следующий код:

<echo message="Checking whether Tomcat is running"/>
<condition property="tomcat.running">
  <socket server="${tomcat.host}" port="${tomcat.port}"/> 
</condition>

Итак, моя следующая задача в этой цели - это задача exec, которая должна выполняться только в том случае, если ${tomcat.running} - false. И, как я уже сказал, я не хочу добавлять одну цель в цель, чтобы использовать свойство if.

4b9b3361

Ответ 1

Объект Ant может иметь необязательное предложение if или unless. Это означает выполнение задачи только в том случае, если свойство задано с предложением if или не выполняется с предложением unless 1. Интересно, что предложение if или unless отмечено после, когда выполняется любая зависимая задача.

Это означает, что вы можете сделать это в стандартном Ant как способ выполнения задачи Ant только при выполнении определенного условия:

 <target name="test.if.tomcat.is.running">
      <condition property="tomcat.running">
          <socket server="${tomcat.host}" port="${tomcat.port}"/> 
      </condition>
</target>

<target name="my.target"
    if="tomcat.running"
    depends="test.if.tomcat.is.running">
    <yaddah/>
    <yaddah/>
    <yaddah/>
</target>

Вы указываете, что хотите Ant выполнить Target my.target. Ant отмечает, что my.target зависит от цели test.if.tomcat.is.running и будет выполнять это в первую очередь. Задача test.if.tomcat.is.running устанавливает свойство tomcat.running, если Tomcat фактически запущен. В противном случае это свойство не задано.

Наконец, Ant вернется к целевому объекту my.target и посмотрит, установлено ли свойство tomcat.running и выполнит только целевой my.target, если он установлен.

Или вы можете использовать задачи Ant -contrib, которые могут облегчить понимание всего процесса сборки.

Если вы хотите перейти по маршруту Ant -Contrib, там есть простой способ настройки Ant -Contrib, поэтому Ant -contrib jar фактически является частью вашего проекта. Если кто-то проверяет ваш проект из системы управления версиями, он также получит банку Ant -contrib, и, следовательно, не придется устанавливать Ant -Contrib самостоятельно.

Загрузите Ant -Contrib jar и поместите его в каталог в корне вашего проекта под названием antlib/ac. antlib может использоваться для всех возможных факультативных задач, таких как Findbugs или PMD. Просто поставьте каждый необязательный баннер Ant в свой собственный каталог под antlib (как я положил Ant -Contrib в каталог ac).

Затем в build.xml вы указываете задачи Ant -Contrib следующим образом:

<taskdef resource="net/sf/antcontrib/antlib.xml">
   <classpath>
       <fileset dir="${basedir}/antlib/ac"/>
   </classpath>
</taskdef>

Теперь вы можете использовать задачи Ant -Contrib, не беспокоясь о том, установлены они на определенном компьютере или нет. Вы проверяете свой проект, и у вас есть доступ к этим задачам автоматически.


1. Правильно, предложение if/unless проверяет, установлено ли свойство, а не true/false, что может вызвать много путаницы. Я видел, что разработчики устанавливают свойство false или no, а затем задаются вопросом, почему цель фактически выполняется, поскольку в предложении if установлено значение false.

Ответ 2

Так как версия 1.9.1 (*) ant поддерживает if- и if-conditions более мелким способом для любой задачи, если вы объявляете необходимые пространства имен внутри элемента проекта.

(*) Пожалуйста, используйте последнюю версию ant (1.9.6 на момент написания этой статьи), так как версия 1.9.1 содержит ошибки WRT этой новой функции, так как пользователь @Rebse любезно указал.

В приведенном ниже примере вы можете играть вокруг комментирования/раскомментации свойств...

<project name="test"
         xmlns:if="ant:if"
         xmlns:unless="ant:unless">

  <property name="is.good" value="hohoho"/>
  <!--property name="hide.base" value="boo"/-->

  <target name="foo">
     <echo unless:set="hide.base">${basedir}</echo>
     <echo if:set="is.good">GOOD</echo>
  </target>
</project>

... и наблюдайте такие выходы, как:

Buildfile: D:\test\ant\taskcondition\build.xml
foo:
     [echo] D:\test\ant\taskcondition
     [echo] GOOD
BUILD SUCCESSFUL
Total time: 191 milliseconds

Ответ 3

Если вы хотите реализовать "если еще":

<target name="test.if.tomcat.is.running">
      <condition property="tomcat.running" value="true" else="false">
          <socket server="${tomcat.host}" port="${tomcat.port}"/> 
      </condition>
</target>

<target name="my.target.running"
    if="${tomcat.running}"
    depends="test.if.tomcat.is.running">
...
</target>

<target name="my.target.ifnotrunning"
    unless="${tomcat.running}"
    depends="test.if.tomcat.is.running">
   .....
</target>

Ответ 4

Есть ситуации, когда вы не можете настроить ваш целевой объект Ant на другой целевой Ant, потому что if следует оценивать на основе значения, инициализированного непосредственно перед exec (я могу предоставить ясный пример, но для простоты я не буду).

В Unix-подобных системах альтернативой (предпочтительнее в некоторых ситуациях) является следующее:

<!-- the property that contains the value to be checked agains IF -->
<property name="myprop" value="true"/>

<!-- the Ant exec combined with OS-IF command -->
<exec executable="bash">
        <arg value="-c" />
        <arg value="if [ &quot;${myprop}&quot; != &quot;$${myprop}&quot;] || [&quot;${tag_exists}&quot; != &quot;true&quot; ]; then my-bash-command _arguments_; fi" />
</exec>

В приведенном выше тексте my- bash -command показана команда/программа, которую вы хотите выполнить, а аргументы отображает аргументы для этой команды.

Обратите внимание, что когда myprop не задан, ${myprop} будет просто вычисляться до строки "$" + "{" + "myprop" + "}" (т.е. ${myprop} "), поэтому нам нужно сравнить значение myprop с этой строкой.

С другой стороны, когда установлено myprop, его значение, вероятно, является строкой true/false, поэтому для проверки IF наше условие мы должны сравнить myprop со строкой true (или любым другим значением, которое у вас может быть).

Заключение: используя Ant exec в сочетании с командой OS IF, мы можем выполнять произвольные команды/программы OS без необходимости еще одна цель Ant. Используя ту же логику, что и выше, выражение IF может быть настроено для работы даже в Windows.