2012-10-04 12 views
13

Per concatenare due file, sembra qualcosa di simile:Usando il concat di grunt, come automatizzare la concatenazione dello stesso file con molti altri file?

concat: { 
    src: ['common.js','js/app.js'], 
    dest: 'assets/js/app.js' 
    } 

E se voglio concat un'intera cartella di file in un unico, sembra qualcosa di simile:

concat: { 
    src: ['dev/*.js','], 
    dest: 'prod/js/app.js' 
    } 

Ma diciamo Ho un file su cui voglio concatenare 10 o 20 altri file e voglio che vengano concatenati separatamente? In altre parole, qui è quello che sto cercando:

A.js + B.js = AB.js 
A.js + C.js = AC.js 
A.js + D.js = AD.js 
A.js + E.js = AE.js 

E così via ... Per essere più precisi, però, riesco a capire come CONCAT file uno per uno come descritto, ma voglio capire come specificare A.js dall'esempio e farlo concat su qualsiasi file in un percorso specificato. Quindi quello che voglio è:

A.js + dev/*.js = AB.js, AC.js, AD.js, AE.js ... 

In pseudo-codice, qui è quello che voglio:

concat: { 
    src: ['common.js', 'dev/*.js','], // common.js gets concatenated to each file in this directory 
    dest: 'prod/js/*.js' // each file in src gets saved separately in dest 
    } 

Apprezzerei tutto l'aiuto, ho avere difficoltà a trovare informazioni su come fare questo

+0

se qualcuno ha bisogno una cosa simile, questo plugin fa proprio questo https://www.npmjs.org/package/grunt-wrap2000 – Tetaxa

+0

tutto quello che devi fare è usare le opzioni banner e piè di pagina in grunt-contrib-concat. Se vuoi anteporre un intero file, fai semplicemente 'banner: require ('./ foo.js')'. lo stesso con il piè di pagina. – jonschlinkert

risposta

19

Il task integrato di Grunt concat (mi raccomando guardare la sorgente btw) non supporta nulla come dest: 'prod/js/*.js', dovresti specificare separatamente ciascun target di output che è un eccesso nel tuo caso.

La soluzione migliore è semplicemente scrivere il proprio codice (magari racchiuderlo nell'attività personalizzata), è piuttosto semplice. Ecco un semplice multitasking wrap. Non vi prometto che è robusto e sicuro da usare :)

grunt.registerMultiTask('wrap', 'Wraps source files with specified header and footer', function() { 
     var data = this.data, 
      path = require('path'), 
      dest = grunt.template.process(data.dest), 
      files = grunt.file.expandFiles(this.file.src), 
      header = grunt.file.read(grunt.template.process(data.header)), 
      footer = grunt.file.read(grunt.template.process(data.footer)), 
      sep = grunt.utils.linefeed; 

     files.forEach(function(f) { 
      var p = dest + '/' + path.basename(f), 
       contents = grunt.file.read(f); 

      grunt.file.write(p, header + sep + contents + sep + footer); 
      grunt.log.writeln('File "' + p + '" created.'); 
     }); 
    }); 

alimentarlo con una configurazione simile a questo:

wrap: { 
    html: { 
     header: '<%= project.partials %>/head.html', 
     footer: '<%= project.partials %>/footer.html', 
     src: [ 
      '<%= project.pages %>/index.html', 
      '<%= project.pages %>/about.html', 
      '<%= project.pages %>/blog.html' 
     ], 
     dest: '.' // destination *directory*, probably better than specifying same file names twice 
    } 
} 

Solo nel caso ho anche aggiornato il vostro violino: http://jsfiddle.net/dipish/hKkGX/

+0

Per chiarire, vorrei che ogni file fosse concatenato separatamente, quindi puoi anche fare dest: 'prod/js/*. Js'? E grazie per la tua risposta! – jonschlinkert

+0

La risposta aggiornata funziona per te? –

+0

sembra che dovrebbe, ma non riesco a farlo funzionare. So che questo è molto da chiedere, ogni possibilità che si possa inserire all'interno di un file grunt di esempio? ecco un jsfiddle con il mio file grunt - solo per una lettura più semplice http://jsfiddle.net/rRpeg/ – jonschlinkert

Problemi correlati