web-dev-qa-db-fra.com

Comment exclure un répertoire du groupe de fichiers ant, basé sur le contenu des répertoires

Comment créer un ensemble de fichiers ant qui exclut certains répertoires en fonction de leur contenu?

J'utilise ant pour créer un fichier de distribution contenant chaque localisation dans des répertoires distincts, dont certains sont incomplets et ne doivent pas être publiés.

J'aimerais ajouter quelque chose dans le répertoire (par exemple, un fichier nommé incomplete.flag) afin que ant exclue le répertoire. Ensuite, je peux supprimer le fichier une fois la traduction terminée et l'inclure dans la construction sans modifier le fichier build.xml.

Étant donné cette structure de répertoire:

proj
+ locale
  + de-DE
  + en-US
  + fr-FR

Cet ensemble de fichiers exclut tous les fichiers incompelte.flag, mais comment puis-je exclure tous les répertoires contenant contient eux?

  <fileset dir="${basedir}">
    <include name="locale/"/>
    <exclude name="locale/*/incomplete.flag">
  </fileset>

Je peux écrire une tâche ant si besoin est, mais j'espère que fileset pourra gérer ce cas d'utilisation.

29
Chadwick

L'approche suivante fonctionne pour moi:

<exclude name="**/dir_name_to_exclude/**" />
57
Sasha

Vous devez ajouter un '/' après le nom du répertoire

<exclude name="WEB-INF/" />
17

Au lieu d’ajouter un fichier incomplete.flag à chaque répertoire à exclure, générez un fichier contenant une liste de tous les répertoires à exclure, puis utilisez l’attribut excludesfile. Quelque chose comme ça:

<fileset dir="${basedir}" excludesfile="FileWithExcludedDirs.properties">
  <include name="locale/"/>
  <exclude name="locale/*/incomplete.flag">
</fileset>

J'espère que ça aide.

7
Alonso

Il existe en fait un exemple pour ce type de problème dans la documentation Ant. Il utilise les sélecteurs .__ (mentionnés ci-dessus) et les mappeurs. Voir le dernier exemple dans http://ant.Apache.org/manual/Types/dirset.html :

<dirset id="dirset" dir="${workingdir}">
   <present targetdir="${workingdir}">
        <mapper type="glob" from="*" to="*/${markerfile}" />
   </present>
</dirset>

Sélectionne tous les répertoires quelque part sous ${workingdir} qui contiennent un ${markerfile}.

5
mgaert

Réponse fournie par l'utilisateur mgaert fonctionne pour moi. Je pense que cela devrait être marqué comme la bonne réponse.

Cela fonctionne aussi avec des sélecteurs complexes comme dans cet exemple:

<!-- 
    selects only direct subdirectories of ${targetdir} if they have a
    sub-subdirectory named either sub1 or sub2
-->
<dirset dir="${targetdir}" >
    <and>
        <depth max="0"/>
        <or>
            <present targetdir="${targetdir}">
                <globmapper from="*" to="*/sub1" />
            </present>
            <present targetdir="${targetdir}">
                <globmapper from="*" to="*/sub2" />
            </present>
        </or>
    </and>
</dirset>

Ainsi, ayant une structure de répertoire comme celle-ci:

targetdir
├── bar
│   └── sub3
├── baz
│   └── sub1
├── foo
│   └── sub2
├── phoo
│   ├── sub1
│   └── sub2
└── qux
    └── xyzzy
        └── sub1

le dirset ci-dessus ne contiendrait que 

bar ne correspond pas à cause de sous3 alors que xyzzy ne correspond pas car ce n'est pas un sous-répertoire direct de targetdir)

2
dinwath

cela fonctionne pour moi avec une cible de pot:

<jar jarfile="${server.jar}" basedir="${classes.dir}" excludes="**/client/">
  <manifest>
    <attribute name="Main-Class" value="${mainServer.class}" />
  </manifest>
</jar>

ce code inclut tous les fichiers de "classes.dir" mais exclut le répertoire "client" du fichier jar.

0
johndoe

Ceci est possible en utilisant le motif "**" comme suit.

<exclude name="maindir/**/incomplete.flag"/>

le 'exclure' ci-dessus exclut complètement tous les répertoires contenant le fichier incomplet.flag.

0
lakhdeep

Je pense qu'un moyen est d'abord de vérifier si votre fichier existe et s'il existe pour exclure le dossier de la copie:

<target name="excludeLocales">

    <property name="de-DE.file" value="${basedir}/locale/de-DE/incompelte.flag"/>
    <available property="de-DE.file.exists" file="${de-DE.file}" />

    <copy todir="C:/temp/">
        <fileset dir="${basedir}/locale">
            <exclude name="de-DE/**" if="${de-DE.file.exists}"/>
            <include name="xy/**"/>
        </fileset>
    </copy>
</target>

Cela devrait fonctionner aussi pour les autres langues.

0
Uncle_Sam

travaille pour moi:

<target name="build2-jar" depends="compile" >
   <jar destfile="./myJjar.jar">
        <fileset dir="./WebContent/WEB-INF/lib" includes="hibernate*.jar,mysql*.jar" />
        <fileset dir="./WebContent/WEB-INF/classes" excludes="**/controlador/*.class,**/form/*.class,**/orm/*.class,**/reporting/*.class,**/org/w3/xmldsig/*.class"/>
   </jar>

0
RaZieRSarE