2009-06-03 5 views
31

Existe-t-il un moyen d'extraire une sous-chaîne d'une propriété Ant et de placer cette sous-chaîne dans sa propre propriété?Comment extraire une sous-chaîne dans Ant

+0

Pouvez-vous être plus précis sur ce que vous essayez de faire? Pourquoi ne serait-il pas plus logique de définir une propriété pour conserver la valeur dont vous dépendez et l'utiliser à plusieurs endroits? Si vos propriétés Ant changent assez souvent que vous avez besoin de réagir par programme, vous pouvez faire autre chose de mal. – PanCrit

Répondre

33

J'utilise scriptdef pour créer une balise javascript substring, pour exemple:

<project> 
    <scriptdef name="substring" language="javascript"> 
    <attribute name="text" /> 
    <attribute name="start" /> 
    <attribute name="end" /> 
    <attribute name="property" /> 
    <![CDATA[ 
     var text = attributes.get("text"); 
     var start = attributes.get("start"); 
     var end = attributes.get("end") || text.length(); 
     project.setProperty(attributes.get("property"), text.substring(start, end)); 
    ]]> 
    </scriptdef> 
    ........ 
    <target ...> 
    <substring text="asdfasdfasdf" start="2" end="10" property="subtext" /> 
    <echo message="subtext = ${subtext}" /> 
    </target> 
</project> 
2

Je voudrais aller avec la force brute et écrire une tâche Ant personnalisée:

public class SubstringTask extends Task { 

    public void execute() throws BuildException { 
     String input = getProject().getProperty("oldproperty"); 
     String output = process(input); 
     getProject().setProperty("newproperty", output); 
    } 
} 

Qu'est-ce qui reste à mettre en œuvre le String process(String) et ajouter quelques setters (par exemple pour les valeurs oldproperty et newproperty)

21

Vous pouvez essayer d'utiliser PropertyRegex from Ant-conrtib.

<propertyregex property="destinationProperty" 
       input="${sourceProperty}" 
       regexp="regexToMatchSubstring" 
       select="\1" 
       casesensitive="false" /> 
+0

Note supplémentaire: Dans le cas où cela est fait dynamiquement dans une boucle, utilisez 'override =" true "' pour remplacer toute valeur précédente. – robinst

0

i utiliserais tâche de script à cette fin, je préfère rubis, par exemple coupé les 3 premiers chars =

<project> 
    <property name="mystring" value="foobarfoobaz"/> 
    <target name="main"> 
    <script language="ruby"> 
    $project.setProperty 'mystring', $mystring[3..-1] 
    </script> 
    <echo>$${mystring} == ${mystring}</echo> 
    </target>  
    </project> 

sortie =

main: 
    [echo] ${mystring} == barfoobaz 

utilisant la api fourmi avec méthode project.setProperty() sur une propriété existante va l'écraser, de cette façon vous pouvez travailler autour de la norme ant comportement, signifie propert s une fois ensemble sont immuables

+0

Salut, j'ai cette erreur: Impossible de créer le moteur de script javax pour ruby ​​ –

+0

Jarod, vous avez besoin de bsf.jar (http://jakarta.apache.org/bsf) et jruby.jar (http: //www.jruby .org), voir aussi http://ant.apache.org/manual/install.html#librarydependencies, notez que le lien vers jruby est faux sur cette page. – Rebse

+0

oh merci Rubse –

8

Depuis que je préfère utiliser la vanille Ant, j'utilise un fichier temporaire. Fonctionne partout et vous pouvez tirer parti de replaceregex pour se débarrasser de la partie de la chaîne que vous voulez . Exemple de fusion de messages Git:

<exec executable="git" output="${git.describe.file}" errorproperty="git.error" failonerror="true"> 
     <arg value="describe"/> 
     <arg value="--tags" /> 
     <arg value="--abbrev=0" /> 
    </exec> 
    <loadfile srcfile="${git.describe.file}" property="git.workspace.specification.version"> 
     <filterchain> 
      <headfilter lines="1" skip="0"/> 
      <tokenfilter> 
       <replaceregex pattern="\.[0-9]+$" replace="" flags="gi"/> 
      </tokenfilter> 
      <striplinebreaks/> 
     </filterchain> 
    </loadfile> 
+4

Si vous traitez une propriété pour commencer, vous pouvez éviter le fichier en faisant quelque chose comme $ {property.here} Scott

+0

Merci! J'ai utilisé '' au lieu de exec et a parfaitement fonctionné –

Questions connexes