web-dev-qa-db-fra.com

Comment extraire une sous-chaîne dans Ant

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é?

34
Lark

J'utilise scriptdef pour créer une balise javascript sur 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>
37
seduardo

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

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

Comme je préfère utiliser Vanilla Ant, j'utilise un fichier temporaire. Fonctionne partout et vous pouvez utiliser replaceregex pour vous débarrasser de la partie de la chaîne que vous ne pas voulez. Exemple pour fusionner 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>
10
Bill Birch

Je suppose qu'une façon simple de faire de la vanille est de:

<loadresource property="destinationProperty">
    <concat>${sourceProperty}</concat>
    <filterchain>
        <replaceregex pattern="regexToMatchSubstring" replace="\1" />
    </filterchain>
</loadresource>
2
Markus Rohlof

J'irais avec la force brute et j'é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);
    }
}

Ce qui reste pour implémenter la String process(String) et ajouter quelques paramètres (par exemple pour les valeurs oldproperty et newproperty)

2
Vladimir

j'utiliserais une tâche de script à cet effet, je préfère Ruby, exemple coupez 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

utiliser l'api ant avec la méthode project.setProperty () sur une propriété existante la remplacera, de cette façon vous pouvez contourner le comportement standard des fourmis, signifie que les propriétés une fois définies sont immuables

0
Rebse