2013-04-19 13 views
8

Definiuję macrodef w Ant i używam javascript do wykonania pracy. W tym przypadku sprawdzam poprawność timezone.W javascriptie uruchomionym z Anta, jak uzyskać wartość argumentu?

<macrodef name="validateTimeZone"> 
    <attribute name="zone" /> 
    <sequential> 
     <echo>result: ${envTZResult}</echo> 
     <echo> validating timezone: @{zone}</echo> 
     <script language="javascript"><![CDATA[ 
      importClass(java.util.TimeZone); 
      importClass(java.util.Arrays); 
      var tz = project.getProperty("zone"); 
      println(" got attribute: " + tz); 
      var result = Arrays.asList(TimeZone.getAvailableIDs()).contains(tz); //testing if timezone is known 
      project.setProperty("zoneIsValid", result); 
     ]]> 
     </script> 
    </sequential> 
</macrodef> 

Problem polega na tym, że project.getProperty() nie pobiera wartości przekazanych atrybutów. Czy ktoś wie, w jaki sposób można uzyskać wartość atrybutu z javascript?

+0

To może pomóc: http://ant.apache.org/manual/Tasks/script.html - Spójrz na przykład w połowie drogi w dół. – techfoobar

Odpowiedz

11

Okazuje się, że byłem przy użyciu niewłaściwego typu tagu. Aby użyć skryptu do zdefiniowania zadania ant, powinienem był użyć scriptdef, a nie macrodef. Dzięki scriptdef istnieją predefiniowane obiekty, które umożliwiają dostęp do atrybutów i elementów zagnieżdżonych w zadaniu.

Działa dostępu do atrybutów z JavaScript w Ant:

<scriptdef name="validateTimeZone" language="javascript"> 
    <attribute name="zone" /> 
    <![CDATA[ 
     importClass(java.util.TimeZone); 
     importClass(java.util.Arrays); 
     var tz = attributes.get("zone"); //get attribute defined for scriptdef 
     println(" got attribute: " + tz); 
     var result = Arrays.asList(TimeZone.getAvailableIDs()).contains(tz); //testing if timezone is known 
     project.setProperty("zoneIsValid", result); 
    ]]> 
</scriptdef> 
5

Najlepiej jest utworzyć właściwość z atrybutem jako wartości, tj

<macrodef name="validateTimeZone"> 
    <attribute name="zone" /> 
    <sequential> 
     <echo>result: ${envTZResult}</echo> 
     <echo> validating timezone: @{zone}</echo> 
     <!-- edit use local with ant 1.8.x --> 
     <local name="zone"/> 
     <property name="zone" value="@{zone}"/> 
     <script language="javascript"><![CDATA[ 
      importClass(java.util.TimeZone); 
      importClass(java.util.Arrays); 
      var tz = project.getProperty("zone"); 
      println(" got attribute: " + tz); 
      var result = Arrays.asList(TimeZone.getAvailableIDs()).contains(tz); //testing if timezone is known 
      project.setProperty("zoneIsValid", result); 
     ]]> 
     </script> 
    </sequential> 
</macrodef> 
+1

To niezły pomysł, ale niestety działa tylko przy pierwszym wywołaniu. Właściwości można ustawić tylko raz w Ant, więc po pierwszym uruchomieniu właściwość 'zone' zawsze będzie mieć tę samą wartość. – Tim

+3

Oczywiście, ale z Ant 1.8> = możesz użyć zadania lokalnego, zobacz edycję – Rebse

Powiązane problemy