2009-07-02 6 views
17

J'utilise un script Ant build pour assembler mon application Eclipse pour la distribution. Une étape de la génération consiste à vérifier que les bibliothèques correctes sont présentes dans les dossiers de génération. J'utilise actuellement la commande Ant pour cela. Malheureusement, je dois modifier le script chaque fois que je passe à une nouvelle version d'Eclipse (puisque les numéros de version auront été mis à jour).Comment utiliser un caractère générique dans la commande Ant disponible

Je n'ai pas besoin de vérifier les numéros de version, j'ai juste besoin de vérifier que le fichier est là.

Alors, comment puis-je vérifier:

org.eclipse.rcp_3.5.0.* 

au lieu de:

org.eclipse.rcp_3.5.0.v20090519-9SA0FwxFv6x089WEf-TWh11 

en utilisant Ant?

applaudissements, Ian

Répondre

22

Vous voulez dire, quelque chose comme (sur la base pathconvert task, après this idea):

<target name="checkEclipseRcp"> 
    <pathconvert property="foundRcp" setonempty="false" pathsep=" "> 
    <path> 
     <fileset dir="/folder/folder/eclipse" 
       includes="org.eclipse.rcp_3.5.0.*" /> 
    </path> 
    </pathconvert> 
</target> 

<target name="process" depends="checkEclipseRcp" if="foundRcp"> 
    <!-- do something --> 
</target> 
+0

qui sonne parfait - je meurs d'envie de l'essayer. Si seulement j'avais posé la question il y a 3 ans, j'aurais économisé trop de temps. acclamations, Ian – ianmayo

0

La tâche de pathconvert est probablement le meilleur moyen d'aller dans la plupart des cas. Mais cela crée un petit problème lorsque l'arborescence des répertoires est très grande et que l'on utilise la tâche echoproperties. Avec une très grande arborescence de répertoires, la chaîne générée par pathconvert peut être énorme. Ensuite, les echoproperties pulvérisent l'énorme chaîne, rendant la sortie plus difficile à travailler. J'utilise un macrodef sur Linux qui crée une propriété définie sur « 1 » s'il y a des fichiers dans le répertoire: cible

<macrodef name="chkDirContents" > 
    <attribute name="propertyName" /> 
    <attribute name="dirPath" /> 
    <attribute name="propertyFile" /> 
    <sequential> 
     <exec executable="sh" dir="." failonerror="false" > 
      <arg value="-c" /> 
      <arg value='fyles=`ls -1 @{dirPath} | head -1` ; if [ "$fyles" != "" ] ; then echo @{propertyName}=1 > @{propertyFile} ; fi' /> 
     </exec> 
    </sequential> 
</macrodef> 

<target name="test" > 
    <tempfile destdir="." property="temp.file" deleteonexit="true" /> 
    <chkDirContents propertyName="files.exist" dirPath="./target_dir" propertyFile="${temp.file}" /> 
    <property file="${temp.file}" /> 

    <echoproperties/> 
</target> 

Exécuter le « test » va générer la ligne echoproperties suivante s'il y a des fichiers dans le ./ target_dir/répertoire:

[echoproperties] files.exist=1 

Qu'est-ce que "test" fait: Il génère un nom de fichier temporaire, $ {} temp.file, qui peut ensuite être utilisé comme fichier de propriétés. Il exécute ensuite le macrodef, qui appelle le shell pour vérifier le contenu du répertoire dirPath. S'il existe des fichiers ou des répertoires dans dirPath, il attribue à la propriété propertyName la valeur 1 dans le fichier temporaire. Il lit ensuite le fichier et définit la propriété donnée dans le fichier. Si le fichier est vide, aucune propriété n'est définie.

Notez que le fichier temporaire peut être réutilisé pour les appels ultérieurs du macrodef si vous le souhaitez. D'un autre côté, bien sûr, une fois qu'une propriété est définie, elle est immuable.

+0

très généreux de vous pour intervenir et offrir l'amélioration. Si seulement j'avais été informé de cette amélioration il y a 4 ans, quand j'ai dit que j'étais au courant de la solution de base 3 ans plus tôt. Qui sait quelle amélioration je pourrais apprendre dans 5 ans? – ianmayo

7

Une approche légèrement plus courte et plus simple avec resourcecount état:

<target name="checkEclipseRcp"> 
    <condition property="foundRcp"> 
     <resourcecount when="greater" count="0"> 
      <fileset file="/folder/folder/eclipse/org.eclipse.rcp_3.5.0.*"/> 
     </resourcecount> 
    </condition> 
</target> 

<target name="process" depends="checkEclipseRcp" if="foundRcp"> 
    <!-- do something --> 
</target> 
Questions connexes