2012-10-04 17 views
13

Para concatenar dos archivos, se ve algo como esto:Usando grunt concat, ¿cómo automatizaría la concatenación del mismo archivo a muchos otros archivos?

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

Y si quiero concat toda una carpeta de archivos en uno solo, se ve algo como esto:

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

Pero digamos Tengo un archivo que quiero concaturar en 10 u otros 20 archivos, y quiero que se concatren por separado. En otras palabras, aquí es lo que estoy buscando:

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

Y así sucesivamente ... Para ser más específicos, sin embargo, puedo encontrar la manera de concat archivos uno por uno como se describe, pero quiero averiguar cómo especificar A.js a partir del ejemplo, y hacer que se concature en cualquier archivo en una ruta especificada. Así que lo que quiero es:

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

En pseudo-código, esto es lo que quiero:

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 
    } 

lo agradecería cualquier ayuda, he tienen dificultades para encontrar información sobre cómo Haga esto

+0

si alguien necesita una cosa similar, este complemento hace precisamente eso https://www.npmjs.org/package/grunt-wrap2000 – Tetaxa

+0

todo lo que necesita hacer es utilizar las opciones de pancarta y pie de página en grunt-contrib-concat. Si desea anteponer un archivo completo, simplemente haga 'banner: require ('./ foo.js')'. lo mismo con el pie de página. – jonschlinkert

Respuesta

19

La tarea integrada de concat de Grunt (recomiendo mirar la fuente btw) no es compatible con nada como dest: 'prod/js/*.js', tendría que especificar cada destino de salida por separado, lo cual es una exageración en su caso.

Su mejor opción es simplemente escribir su propio código (tal vez envolverlo en su tarea personalizada), es bastante simple. Aquí hay una simple wrap multitarea. No prometa que es robusto y seguro de usar :)

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 configuración como esta:

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 
    } 
} 

Sólo en caso de que también actualizó su violín: http://jsfiddle.net/dipish/hKkGX/

+0

Para aclarar, me gustaría que cada archivo se concature por separado, por lo que también puede hacer el dest: 'prod/js/*. Js'? ¡Y gracias por tu respuesta! – jonschlinkert

+0

¿La respuesta actualizada funciona para usted? –

+0

parece que debería, pero no puedo hacer que funcione. Sé que es mucho pedir, ¿hay alguna posibilidad de que puedas poner esto dentro de un archivo gruñido de ejemplo? aquí está un jsfiddle con mi archivo grunt - solo para facilitar la lectura http://jsfiddle.net/rRpeg/ – jonschlinkert

Cuestiones relacionadas