2016-04-18 2 views
0

У меня есть цель, которая запускает задачу, которая задает свойство. Другая цель проверяет это свойство, и если это правда, он снова вызывает первую цель. Но как только первая цель запущена и устанавливает свойство, она никогда не изменяет ее снова! (И я знаю, что это должно быть изменение, потому что я могу видеть состояние арг изменить)Вызов муравьиной цели несколько раз не сбрасывает свойство

(я не могу установить библиотеку вно - не мой выбор - так я застрял делать эту работу вокруг)

<target name="check-service-state"> 

    <!-- See if the service is running or not --> 
    <exec executable="ssh" outputproperty="service.state" failonerror="false"> 
     <arg value="-t" /> 
     <arg value="-t" /> 
     <arg value="${username}@${ssh.host}" /> 
     <arg value="sudo initctl list | grep ${service.name}" /> 
    </exec> 

    <condition property="service.running" else="false"> 
     <or> 
      <contains string="${service.state}" substring="start/running" /> 
     </or> 
    </condition> 
    <echo message="${service.running}" />    
</target> 

<target name="restart-service" depends="stop-service"> 

    <!-- Check if service stopped --> 
    <antcall target="check-service-state" /> 
    <sleep seconds="1" /> 

    <!-- now try to start again, or wait and recheck --> 
    <antcall target="service-not-stopped" /> 
    <antcall target="service-stopped" /> 

</target> 

<target name="wait-for-service"> 

    <!-- Check if service stopped --> 
    <antcall target="check-service-state" /> 

    <!-- now try to start again --> 
    <antcall target="service-not-stopped" /> 
    <antcall target="service-stopped" /> 

</target> 

<!-- Acts as a loop/wait check for service stopping --> 
<target name="service-not-stopped" if="${service.running}"> 
    <echo message="${service.state}" /> 
    <antcall target="wait-for-service" /> 
</target> 

<!-- Acts as a break from the loop/check for service stopping --> 
<target name="service-stopped" unless="${service.running}"> 
    <antcall target="start-service" /> 
</target> 

свойство service.running изменяется только один раз, а затем всегда остается правдой, хотя теперь оно должно быть ложным.

ответ

1

Свойства неизменяемы в ANT, поэтому он не меняется после его установки в первый раз. This stackoverflow thread дает несколько обходных решений. Я лично использовал JavaScript для устранения этого, как описано в приведенной выше ссылке:

<scriptdef name="propertyreset" language="javascript" description="Allows to assign @{property} new value"> <attribute name="name"/> <attribute name="value"/> project.setProperty(attributes.get("name"), attributes.get("value")); </scriptdef>

Использование:

<property name="x" value="10"/> 
<propertyreset name="x" value="11"/> 
<echo>${x}</echo> <!-- will print 11 --> 
+0

И это будет работать в Ant (1.9.6) без вно? –

+2

@DonRhummy Зависит больше от вашей JVM. Javascript (Rhino) был связан с Java6, Java8 имеет новый механизм Javascript под названием Nashorn. –

Смежные вопросы