94 votes

Ant: Comment faire pour exécuter une commande pour chaque fichier dans le répertoire?

Je veux exécuter une commande à partir d'une Fourmi buildfile, pour chaque fichier dans un répertoire.
Je suis à la recherche d'une plate-forme indépendante de la solution.

Comment dois-je faire?

Bien sûr, je pourrais écrire un script dans certains langage de script, mais ce serait ajouter d'autres dépendances du projet.

86voto

Alex Points 828

Utilisez le <appliquer> tâche.

Il exécute une commande une fois pour chaque fichier. Spécifiez les fichiers par l'intermédiaire de filesets ou de toute autre ressource. <appliquer> est intégré; sans supplément de dépendance nécessaire; pas de tâche personnalisée mise en œuvre nécessaires.

Il est également possible d'exécuter une commande en une seule fois, en ajoutant tous les fichiers comme arguments d'un seul coup. Utiliser le parallèle attribut pour changer le comportement.

Désolé pour le retard d'un an.

59voto

blak3r Points 5096

Réponse Courte

Utiliser <foreach> avec un imbriquée <FileSet>

Foreach nécessite ant-contrib.

Mise à jour pour l'Exemple des récentes ant-contrib:

<target name="foo">
  <foreach target="bar" param="theFile">
    <fileset dir="${server.src}" casesensitive="yes">
      <include name="**/*.java"/>
      <exclude name="**/*Test*"/>
    </fileset>
  </foreach>
</target>

<target name="bar">
  <echo message="${theFile}"/>
</target>

Ce sera antcall la cible "bar", avec le ${theFile} résultant dans le fichier courant.

27voto

Jmini Points 1371

Une approche sans ant-contrib est suggéré par Tassilo Corne (la cible d'origine est ici)

Bref, comme il n'y a pas d'extension de <java> (encore?) de la même manière que <appliquer> extends <exec>, il suggère d'utiliser des <appliquer> (qui peut bien sûr également exécuter un programm en java en ligne de commande)

Voici quelques exemples:

  <apply executable="java"> 
    <arg value="-cp"/> 
    <arg pathref="classpath"/> 
    <arg value="-f"/> 
    <srcfile/> 
    <arg line="-o ${output.dir}"/> 

    <fileset dir="${input.dir}" includes="*.txt"/> 
  </apply> 

17voto

ams Points 9588

Voici la façon de le faire à l'aide de javascript et la fourmi scriptdef tâche, vous n'avez pas besoin d'ant-contrib pour que ce code fonctionne depuis scriptdef est l'un des principaux tâche ant.

<scriptdef name="bzip2-files" language="javascript">
<element name="fileset" type="fileset"/>
<![CDATA[
  importClass(java.io.File);
  filesets = elements.get("fileset");

  for (i = 0; i < filesets.size(); ++i) {
    fileset = filesets.get(i);
    scanner = fileset.getDirectoryScanner(project);
    scanner.scan();
    files = scanner.getIncludedFiles();
    for( j=0; j < files.length; j++) {

        var basedir  = fileset.getDir(project);
        var filename = files[j];
        var src = new File(basedir, filename);
        var dest= new File(basedir, filename + ".bz2");

        bzip2 = self.project.createTask("bzip2");        
        bzip2.setSrc( src);
        bzip2.setDestfile(dest ); 
        bzip2.execute();
    }
  }
]]>
</scriptdef>

<bzip2-files>
    <fileset id="test" dir="upstream/classpath/jars/development">
            <include name="**/*.jar" />
    </fileset>
</bzip2-files>

15voto

Jeffrey Fredrick Points 3531

ant-contrib est le mal; écrire une coutume tâche ant.

ant-contrib est le mal parce qu'il essaie de convertir ant à partir d'un style déclaratif à un impératif de style. Mais xml permet une merde langage de programmation.

En revanche, une coutume tâche ant permet d'écrire dans un vrai langage (Java), avec une vraie IDE, où vous pouvez écrire des tests unitaires pour s'assurer vous avoir le comportement que vous voulez, et ensuite faire une propre déclaration dans votre script de construction sur le comportement que vous souhaitez.

Cette diatribe seulement si vous vous souciez de l'écriture facile à maintenir les scripts ant. Si vous n'avez pas de soins sur la maintenabilité par tous les moyens de faire tout ce qui fonctionne. :)

La foi

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