2010-03-03 10 views
6

Ho un set di file che sto raccogliendo in un form di formiche, che voglio dividere in sottoinsiemi di uguale dimensione.Come dividere un set di file in Ant in più set

Qual è un buon modo semplice per farlo in Ant senza aggiungere attività personalizzate.

Esempio:

Fileset contiene

TestOne.java 
TestTwo.java 
TestThree.java 
TestFour.java 
TestFive.java 
TestSix.java 

desidero 3 filesets

Fileset1

TestOne.java 
TestTwo.java 

Fileset2

TestThree.java 
TestFour.java 

Fileset3

TestFive.java 
TestSix.java 

risposta

9

Partendo dal presupposto che l'ordine dei file non è importante, e quando si dice no attività personalizzate non si è escluso il compito formica script, qualcosa di deriva da questo potrebbe essere adatto.

<fileset id="Fileset" dir="${basedir}" includes="Test*.java" /> 

<target name="scr"> 
    <script language="javascript"> 
    <![CDATA[ 
     // Obtain a reference to fileset in the enclosing project 
     var fileSet = project.getReference("Fileset"); 

     // Now get matching files. 
     var ds = fileSet.getDirectoryScanner(project); 
     var includes = ds.getIncludedFiles(); 

     var batchSize = 2; 
     var batch = 1; 
     for (var i = 0; i < includes.length; i += batchSize) 
     { 
      // Create a new fileset to hold the sub-Fileset. 
      var filesetN = project.createDataType("fileset"); 
      filesetN.setDir(fileSet.getDir()); 

      // Give the new Fileset an id and associate with the project. 
      project.addReference("Fileset" + batch, filesetN); 

      // Populate the sub-Fileset. 
      for (var j = 0; j < batchSize && (i + j) < includes.length; j++) 
      { 
       filesetN.setIncludes(includes[i + j]); 
      } 

      batch++; 
     } 
    ]]> 
    </script> 

    <!-- Just to illustrate. --> 
    <echo message="Set 1: ${toString:Fileset1}" /> 
    <echo message="Set 2: ${toString:Fileset2}" /> 
    <echo message="Set 3: ${toString:Fileset3}" /> 
</target> 

Dato i file sei tu citi, quanto sopra dà:

scr: 
    [echo] Set 1: TestFive.java;TestFour.java 
    [echo] Set 2: TestOne.java;TestSix.java 
    [echo] Set 3: TestThree.java;TestTwo.java 

io non sono venuto con un modo formica pura per raggiungere questo obiettivo. Potresti considerare ant-contrib che è un insieme di estensioni ampiamente utilizzato che si adatta alle proprietà di loop e mutabili.

Commento finale, per il set di esempio è possibile ottenere l'effetto desiderato, ma non si estende oltre tre set di file. Utilizza first e lastresource collections.

<target name="reso"> 
    <first id="Fileset1" count="2"> 
     <fileset refid="Fileset" /> 
    </first> 
    <last id="Fileset3" count="2"> 
     <fileset refid="Fileset" /> 
    </last> 
    <difference id="Fileset2"> 
     <resources refid="Fileset" /> 
     <resources refid="Fileset1" /> 
     <resources refid="Fileset3" /> 
    </difference> 
</target> 
+0

Stavo cercando di evitare il javascript, ma immagino che non ci sia modo? –

+0

@John Non riesco a pensare a una soluzione di pura formica. Ho aggiunto un paio di altre idee. –

+2

wait, puoi inserire javascript all'interno di uno script ant? Che tipo di stregoneria è questa? – Hoffmann

Problemi correlati