gruntjs - instalar - nodejs grunt
Uso de grunt para concat muchos archivos de muchos directorios en un solo archivo renombrado en un nuevo directorio (1)
Tengo un proyecto angular con potencialmente muchos módulos. Cada módulo tiene su propio directorio con subdirectorios para controladores, directivas, servicios, etc. Algo así:
src
|-- js
|-- modules
|-- moduleOne
| module.js
|-- controllers
| listController.js
| detailController.js
|-- directives
| listItem.js
| summaryWidget.js
|-- filters
|-- services
| moduleService.js
Mi compilación esencialmente agrupa y compila archivos de src / y pone en dev /, luego reduce los archivos en dev / y se mueve a prod /. Durante el desarrollo, el servidor apunta a la carpeta dev / y en producción, el servidor apunta a la carpeta prod / (también el motivo por el que los archivos terminan en .min.js, aunque solo están compilados / concilados). Este proceso está funcionando bien.
Actualmente, mi tarea de concat está capturando todos los archivos en moduleOne / y creando un solo archivo moduleOne.js en mi directorio dev. Esto es lo que quiero que suceda, pero de forma más dinámica:
concat: {
modules: {
files: {
"dev/js/modules/moduleOne.min.js": [
"src/js/modules/moduleOne/*.js",
"src/js/modules/moduleOne/**/*.js"
],
"dev/js/modules/moduleTwo.min.js": [
"src/js/modules/moduleTwo/*.js",
"src/js/modules/moduleTwo/**/*.js"
]
}
}
}
El problema es que tengo que hacer esto para cada módulo, pero no creo que lo necesite.
Intenté hacer lo siguiente porque es algo de lo que quiero hacer:
concat: {
modules: {
files: [{
expand: true,
cwd: "src/js/modules",
src: "**/*.js",
dest: "dev/js/modules",
ext: ".min.js"
}]
}
}
Pero el resultado fue que todos mis archivos y la estructura de directorios pasaron de src / a dev /. Básicamente utilicé concat para hacer una copia, no es útil.
Me gustaría hacer algo como esto:
concat: {
modules: {
files: [{
expand: true,
cwd: "src/js/modules",
src: "**/*.js",
dest: "dev/js/modules/<foldername>.min.js", <- how do I achieve this?
}]
}
}
He estado leyendo mucho, pero parece que solo estoy cerca de encontrar la respuesta y tengo problemas para reunir los conceptos. Mucho de lo que encuentro es solo archivos individuales en un nuevo directorio, con un cambio de nombre. Me gustaría tener varios archivos para un solo archivo en un nuevo directorio con un cambio de nombre. Porque es así como ruedo :)
Entonces, encontré la respuesta que estaba buscando.
Esta publicación de SO fue básicamente la misma pregunta con una buena respuesta. Desafortunadamente, no surgió cuando estaba creando mi pregunta o, de lo contrario, no estarías leyendo esto.
Hubo un ligero cambio en mis necesidades. Necesitaba hacerlo dinámicamente por módulo en lugar de solo un archivo compile.js, por lo que mi código final es el siguiente, ubicado justo después de mi initConfig ():
grunt.registerTask("prepareModules", "Finds and prepares modules for concatenation.", function() {
// get all module directories
grunt.file.expand("src/js/modules/*").forEach(function (dir) {
// get the module name from the directory name
var dirName = dir.substr(dir.lastIndexOf(''/'')+1);
// get the current concat object from initConfig
var concat = grunt.config.get(''concat'') || {};
// create a subtask for each module, find all src files
// and combine into a single js file per module
concat[dirName] = {
src: [dir + ''/**/*.js''],
dest: ''dev/js/modules/'' + dirName + ''.min.js''
};
// add module subtasks to the concat task in initConfig
grunt.config.set(''concat'', concat);
});
});
// the default task
grunt.registerTask("default", ["sass", "ngtemplates", "prepareModules", "concat", "uglify", "cssmin"]);
Básicamente, esto hace que mi tarea concat parezca como cuando la codifiqué manualmente, pero un poco más simple (¡y escalable!).
concat: {
...
moduleOne: {
src: "src/js/modules/moduleOne/**/*.js",
dest: "dev/js/modules/moduleOne.min.js"
},
moduleTwo:{
src: "src/js/modules/moduleTwo/**/*.js",
dest: "dev/js/modules/moduleTwo.min.js"
}
}
Otra desviación que hice de la publicación SO fue que elegí no hacer que prepareModules ejecute concat por su cuenta cuando se realizó. Mi tarea por defecto (que el reloj está configurado para ejecutarse durante el desarrollo) todavía hace todo mi procesamiento.
Esto me deja con la siguiente estructura, lista para la minificación en prod /:
| dev
| js
| modules
|-- moduleOne.min.js
|-- moduleTwo.min.js