2009-07-22 3 views
30

J'ai besoin d'un script Ant qui va copier un dossier à plusieurs autres endroits. En tant que bon programmeur obéissant, je ne veux pas me répéter. Est-il possible de prendre un ensemble de fichiers comme ceci:Ant: copier le même groupe de fichiers à plusieurs endroits

<copy todir="${target}/path/to/target/1"> 
    <fileset dir="${src}"> 
     <exclude name='**/*svn' /> 
    </fileset> 
</copy> 

et le stockage du fileset dans une variable de sorte qu'il peut être réutilisé?

Répondre

38

Déclarez un attribut id sur l'ensemble de fichiers, puis référencez-le dans chaque tâche de copie.

Par exemple:

<project name="foo"> 
    <fileset id="myFileSet" dir="${src}"> 
    <exclude name='**/*svn' /> 
    </fileset> 
    ... 
    <target name="copy1"> 
    <copy todir="${target}/path/to/target/1"> 
     <fileset refid="myFileSet"/> 
    </copy> 
    </target> 
    <target name="copy2"> 
    <copy todir="${target}/path/to/target/2"> 
     <fileset refid="myFileSet"/> 
    </copy> 
    </target> 
</project> 
+0

Correct. Ceci est défini ici: https://ant.apache.org/manual/Types/filterset.html dans la section "Définir un FilterSet et le référencer plus tard." –

+0

Notez que certains sélecteurs d'ensembles de fichiers peuvent avoir des effets secondaires, ce qui signifie que la référence au même groupe de fichiers deux fois ne donnera pas les mêmes résultats. Par exemple: '' mettra à jour son cache après la première exécution, et se référant à l'ensemble de fichiers plus tard, en supposant qu'aucun changement dans les fichiers sous-jacents, retournera un ensemble vide. –

28

Rich's answer est probablement mieux pour votre problème spécifique, mais la manière générique de réutilisation du code dans Ant est un <macrodef>.

<macrodef name="copythings"> 
    <attribute name="todir"/> 
    <sequential> 
    <copy todir="@{todir}"> 
     <fileset dir="${src}"> 
     <exclude name='**/*svn' /> 
     </fileset> 
    </copy> 
    </sequential> 
</macrodef> 

<copythings todir="/path/to/target1"/> 
<copythings todir="/path/to/target2"/> 
+0

Ceci devrait être la réponse acceptée. La réponse acceptée est le code répété, ce qui est exactement ce que le PO a dit qu'il essayait d'éviter. – searchengine27

0

La première réponse a été supprimée, mais vous pouvez également utiliser un mappeur pour copier vers plusieurs destinations.

Questions connexes