39 votes

Comment extraire une sous-chaîne dans Ant

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

0 votes

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 contenir la valeur dont vous dépendez et de l'utiliser à plusieurs endroits ? Si les propriétés de votre Ant changent assez souvent pour que vous deviez y réagir par programme, il se peut que vous fassiez quelque chose de mal.

39voto

seduardo Points 336

J'utilise scriptdef pour créer un tag javascript pour substring, par 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>

23voto

Instantsoup Points 6428

Vous pouvez essayer d'utiliser PropertyRegex de Ant-Contrib .

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

0 votes

Remarque supplémentaire : si cette opération est effectuée dynamiquement dans une boucle, il faut utiliser override="true" pour remplacer toute valeur précédente.

10voto

Bill Birch Points 61

Comme je préfère utiliser vanilla Ant, j'utilise un fichier temporaire. Cela fonctionne partout et vous pouvez vous servir de replaceregex pour vous débarrasser de la partie de la chaîne de caractères que vous voulez utiliser. Ne le fais pas. veulent. Exemple pour le traitement des 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>

5 votes

Si vous traitez avec une propriété pour commencer, vous pouvez éviter le fichier en faisant quelque chose comme <loadresource><concat>${propriété.ici}. </concat><filterchain><replaceregex pattern="*eek"/></filterchain> </loadresource>.

0 votes

Merci. J'ai utilisé <echo file="version.txt" message="${version}"/> au lieu de exec et a fonctionné parfaitement

2voto

Vladimir Points 4511

J'utiliserais la force brute et écrirais 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);
    }
}

Il ne reste plus qu'à mettre en œuvre le String process(String) et ajoutez quelques paramètres (par exemple pour l'option oldproperty et newproperty valeurs)

0voto

Rebse Points 5278

J'utiliserais la tâche script pour cela, je préfère ruby, exemple couper les 3 premiers caractères =

<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

en utilisant l'api ant avec la méthode project.setProperty() sur un projet existant. existante va l'écraser, de cette façon vous pouvez contourner le comportement standard de ant les propriétés, une fois définies, sont immuables

0 votes

Bonjour, j'ai reçu cette erreur : Impossible de créer le moteur javax script pour ruby.

0 votes

Jarod, vous avez besoin de bsf.jar ( jakarta.apache.org/bsf ) et jruby.jar ( jruby.org ), voir également ant.apache.org/manual/install.html#librarydependencies Notez que le lien vers jruby est erroné sur cette page.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X