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.
L'approche suivante fonctionne pour moi:
<exclude name="**/dir_name_to_exclude/**" />
Vous devez ajouter un '/' après le nom du répertoire
<exclude name="WEB-INF/" />
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.
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}
.
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 quexyzzy
ne correspond pas car ce n'est pas un sous-répertoire direct detargetdir
)
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.
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.
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.
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>