2009-07-22 17 views
30

Necesito un script Ant que copie una carpeta en varios otros lugares. Como un buen programador obediente, no quiero repetirme. ¿Hay alguna manera de tomar un conjunto de archivos de la siguiente manera:Ant: copie el mismo conjunto de archivos en varios lugares

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

y almacenar los fileset en una variable para que pueda ser reutilizado?

Respuesta

38

Declare un atributo id en el conjunto de archivos y luego hágalo en cada tarea de copia.

Por ejemplo:

<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

Correcto. Esto se define aquí: https://ant.apache.org/manual/Types/filterset.html en la sección "Definir un conjunto de filtros y consultarlo más adelante". –

+0

Tenga en cuenta que algunos selectores de conjuntos de archivos pueden tener efectos secundarios, lo que significa que al hacer referencia dos veces al mismo conjunto de archivos no se obtendrán los mismos resultados. Por ejemplo: '' actualizará su caché después de la primera ejecución, y al volver a referirse al conjunto de archivos más tarde, suponiendo que no hay cambios en los archivos subyacentes, devolverá un conjunto vacío. –

28

Rich's answer es probablemente mejor para su problema específico, pero la forma genérica de la reutilización de código en Ant es una <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

Esta debería ser la respuesta aceptada. La respuesta aceptada es el código repetido, que es exactamente lo que OP dijo que estaba tratando de evitar. – searchengine27

0

Ya se ha cambiado la primera respuesta, pero también puede utilizar un correlacionador para copiar en múltiples destinos.

Cuestiones relacionadas