contrib - Usando grunt concat, ¿cómo automatizaría la concatenación del mismo archivo a muchos otros archivos?
grunt tutorial (1)
Para concatenar dos archivos, se ve algo como esto:
concat: {
src: [''common.js'',''js/app.js''],
dest: ''assets/js/app.js''
}
Y si quiero combinar una carpeta completa de archivos en uno, se ve así:
concat: {
src: [''dev/*.js'',''],
dest: ''prod/js/app.js''
}
Pero digamos que tengo un archivo que quiero concaturar en 10 u otros 20 archivos, ¿y quiero que se concatren por separado? En otras palabras, esto 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 ... Sin embargo, para ser más específico, puedo averiguar cómo juntar los archivos uno por uno como se describe, pero quiero averiguar cómo especificar A.js en el ejemplo, y hacer que se concature en cualquier archivo en una ruta especificada Entonces, 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
}
Agradecería cualquier ayuda. Tengo dificultades para encontrar información sobre cómo hacer esto.
La tarea de concaturión incorporada de Grunt (recomiendo mirar la fuente por cierto) no admite nada como dest: ''prod/js/*.js''
, tendría que especificar cada objetivo de salida por separado, que 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 multitarea simple. 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.'');
});
});
Aliméntalo 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
}
}
Por si acaso también actualicé tu violín: http://jsfiddle.net/dipish/hKkGX/