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é?
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>
Vous pouvez essayer d'utiliser PropertyRegex de Ant-Contrib .
<propertyregex property="destinationProperty"
input="${sourceProperty}"
regexp="regexToMatchSubstring"
select="\1"
casesensitive="false" />
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>
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>
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
)
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