2011-05-02 12 views
6

Cómo conservar el orden de archivos en Ant concat?Cómo conservar el orden de archivos en Ant concat?

concat simple con el conjunto de archivos & includesfile produce más orden "al azar", como el orden no está garantizada:

<concat destfile="C:/targetdir/concatenated.file"> 
    <fileset dir="C:/sourcedir/"> 
     <includesfile name="C:/targetdir/includes.file" /> 
    </fileset> 
</concat> 

Lo que necesito es la concatenación con el fin específico de que los archivos se muestran en el archivo includes.

Hasta ahora he encontrado ResourceList, que debe preservar el orden, pero me parece que no puede ser capaz de producir cualquier archivo concatenado con él. :/

<concat destfile="C:/targetdir/concatenated.file"> 
    <resourcelist> 
     <file file="C:/targetdir/includes.file"/> 
     <filterchain> 
      <striplinecomments> 
       <comment value="#"/> 
      </striplinecomments> 
      <prefixlines prefix="C:/sourcedir/"/> 
     </filterchain> 
    </resourcelist> 
</concat> 

Además, el ResourceList parece que no puede manejar filas como

LibraryX/A/Stuff/Morestuff/* 

En lugar de la fila solo produce un ".../Morestuff/* no existe." -Error

Incluye archivo de lista de rutas relativas tiene:

LibraryX/A/Stuff/FileA.txt 
LibraryX/A/Stuff/FileB.txt 
LibraryX/A/Stuff/FileC.txt 
LibraryX/A/Stuff/FileY.txt 
+0

qué orden usted espera ser implicado por el comodín '*' 'en LibraryX/A/Cosas/Morestuff/* '? Además, cuando pruebas el concat, ¿qué ocurre? ¿Silenciosamente no hace nada? O algún error específico? –

+0

Para comodines, el orden no es importante. Hay ciertas cosas para cada proyecto que deberían estar al comienzo del archivo concatenado. La concatenación con el resourcelist no parece hacer nada, incluso si elimino las líneas ofensivas ..:/ – crappish

Respuesta

2

[En Ant 1.8.2+] También puede pasar el conjunto de archivos a través de una especie, y ordenar el nombre del archivo, como a continuación:

<concat destfile="./${dir.publish}/${dir.js}/b.main-${build.number}.debug.js"> 
    <sort xmlns:rcmp="antlib:org.apache.tools.ant.types.resources.comparators"> 
      <fileset dir="./${dir.publish}/"> 
       <include name="**/${dir.js.main}/**/*.js"/> 
       <exclude name="**/${dir.js.main}/**/*.min.js"/> 
      </fileset> 
      <rcmp:name /> 
    </sort> 
    </concat> 

Un par de cosas a tener en cuenta:

  1. Los directorios son ordenados antes que los archivos
  2. capitales vienen antes minúsculas

ACTUALIZACIÓN: Otra alternativa si es necesario especificar manualmente orden:

<!-- create a ordered list of all the build files so that CIAPI & CIAPI.widget are built first 
    (can't find a smarter way to do this, since ant filesets are unordered) --> 
<fileset id="a" dir="."><include name="CIAPI/build.project.xml"/></fileset> 
<fileset id="b" dir="."><include name="CIAPI.widget/build.project.xml"/></fileset> 
<fileset id="c" dir="."> 
    <include name="**/build.project.xml"/> 
    <exclude name="CIAPI/build.project.xml" /> 
    <exclude name="CIAPI.widget/build.project.xml" /> 
</fileset> 
<union id="all_build_files"> 
    <fileset refid="a"/> 
    <fileset refid="b"/> 
    <fileset refid="c"/> 
</union> 

feo, pero, eh, esto es hormiga?

0

probar esto, poner en orden alfabético

<project name="concatPath" default="full"> 
<target name="full"> 
    <fileset id="fs" dir="./files" /> 
    <pathconvert refid="fs" property="concatList" pathsep=";" targetos="unix"/> 
    <echo>${concatList}</echo> 
</target> 
</project> 

esto se puede utilizar con la estructura jerárquica de directorios, y el orden será el expuesto por David.

13

que fue capaz de obtener una lista de archivos de trabajo con bastante facilidad:

<concat destfile="C:/targetdir/concatenated.file"> 
    <filelist dir="C:/sourcedir/"> 
     <file name="i.txt" /> 
     <file name="n.txt" /> 

     <file name="o.txt" /> 
     <file name="r.txt" /> 
     <file name="d.txt" /> 
     <file name="e.txt" /> 
     <file name="r.txt" /> 
    </filelist> 
</concat> 

Espero que ayude!

+2

Esto no permite comodines. – mgaert

6

Si está utilizando 1.7+ hormiga, puede utilizar el comando sort

<concat destfile="C:/targetdir/concatenated.file"> 
     <sort> 
      <fileset dir="C:/sourcedir/"> 
       <include name="C:/targetdir/*.file" />      
      </fileset>    
     </sort>    
    </concat> 

Puede encontrar la documentación de tipo here

0

Recuerde que XML no depende del orden, por definición.

Para concatenar archivos en un orden ordenado, considere usar <replace> en su lugar.

Cree un archivo de orden que defina el orden. Luego, en su fichero de construcción:

  1. Copia el archivo para el archivo de destino con <copy>
  2. concatenar los archivos juntos en un archivo temporal con <concat>
  3. Cargar los archivos en propiedades con <loadfile>
  4. Insertar el texto de esos archivos en el archivo de destino con <replace>

Ejemplo de archivo de pedido order_file.txt:

FILE_A_HERE 
    CONCAT_FILES_HERE 

Ejemplo hormiga fichero de construcción build.xml :

<copy file="order_file.txt" tofile="destination.txt" overwrite="yes"> 
    <concat destfile="tempfile.txt"> 
     <fileset dir="includes/"> 
      <include name="*.txt"> 
      <exclude name="fileA.txt"> 
     </fileset> 
    </concat> 
    <loadfile property="fileA" srcFile="includes/fileA.txt" /> 
    <loadfile property="concatFile" srcFile="tempfile.txt" /> 
    <replace file="destination.txt" token="FILE_A_HERE" value="fileA" /> 
    <replace file="destination.txt" token="CONCAT_FILES_HERE" value="concatFile" /> 
Cuestiones relacionadas