2009-11-12 3 views
2

Ce que j'essaie de faire est de compiler un fichier qui prend sa version à partir d'une constante dans mes fichiers source.Impossible d'accéder à la propriété générée par un script dans une cible ANT importée

J'ai une configuration comme celui-ci (ou au moins les bits significatifs):

tâches/compile.xml

<project name="Compile"> 
    <target name="check.version"> 
     <script language="javascript"> 
      regex = /VERSION.+?"([\d\.]+)";/; 
      r = new java.io.BufferedReader(new java.io.FileReader(new java.io.File(file))); 
      line = r.readLine(); 
      while ((line = r.readLine()) != null) { 
       m = regex.exec(line); 
       if (m) { 
        project.setProperty("project.version" , m[1]); 
        break; 
       } 
      } 
      r.close(); 
     </script> 
     <echo>${ant.project.name}-${project.version}</echo> <!-- = Fail-0.2 --> 
    </target> 
</project> 

et un build.xml:

<project name="Fail"> 
    <import file="${basedir}/build/tasks/compile.xml"/> 

    <target name="test"> 
     <antcall target="check.version"> 
      <param name="file" value="${basedir}/Source.as"/> 
     </antcall> 
     <echo>${project.version}</echo> <!-- = ${project.version} --> 
     <echoproperties></echoproperties> 
    </target> 
</project> 

Ainsi, il semble que la propriété définie par le script n'est définie que localement dans cette cible, si je spécifie une autre cible dans le même projet ("Compile"), elle ne connaîtra pas non plus cette propriété.

J'ai également essayé de définir un dans le fichier XML "Compile" -project mais il ne sera pas écrasé par la cible de toute façon.

Alors, comment puis-je accéder à cette propriété générée par le script? Ou y a-t-il une autre façon de faire quelque chose comme ça? Je voudrais vraiment garder cette partie dans un fichier XML séparé car cela rend le script de construction du projet beaucoup plus propre.

Merci!

+0

En outre, connaissez-vous des canaux IRC (avec des personnes) pour les questions relatives aux fourmis? –

Répondre

2

Si vous appelez l'autre cible via antcall, les propriétés qui y sont définies ne seront pas dans la portée de l'appelant.

Si vous devez accéder à des propriétés définies par une autre cible, vous pouvez déclarer cette cible en tant que dépendance pour vous assurer qu'elle est exécutée avant votre cible. Comme ceci:

<target name="test" depends="check.version"> 
    <echo>${project.version}</echo> <!-- = value set in check.version --> 
    <echoproperties></echoproperties> 
</target> 

Edit: Il y a aussi la tâche AntCallBack qui est disponible à partir Ant-Contrib et Antelope:

AntCallBack est identique à la standard 'antcall' tâche, sauf que il permet aux propriétés définies dans la cible d'être disponibles dans la cible .

+0

Excellent! Mais comme je ne peux pas passer un paramètre dans un dépend (ou puis-je?) Je cherche simplement une propriété alors. Merci! –

+0

Édité la réponse pour ajouter une mention de tâche 'antcallback' de Ant-Contrib. –

Questions connexes