javascript - tutorial - grunt vs gulp
¿Cómo ve varios archivos, pero solo ejecuta la tarea en un archivo modificado, en Grunt.js? (7)
Al aprender a usar ronco , intento hacer un simple compilador / observador de script de café. El problema es que si le digo a la tarea de vigilancia que vea varios archivos, y uno de ellos cambia, pasará todos los archivos al comando de coffee
. Esto significa que cuando cambie 1 archivo, va a volver a compilar todos los archivos que coincidan con el patrón src
. En cambio, solo quiero recompilar el único archivo que cambió que coincide con el patrón src
.
Aquí está el grunt.js
:
module.exports = function(grunt) {
grunt.initConfig({
coffee: {
app: {
src: [''test/cases/controller/*.coffee''],
dest: ''tmp'',
options: {
bare: true,
preserve_dirs: true
}
}
},
watch: {
files: [''<config:coffee.app.src>''],
tasks: [''coffee:app'']
}
});
grunt.loadNpmTasks(''grunt-coffee'');
grunt.registerTask(''default'', ''coffee'');
};
Esto está usando grunt-coffee , que es básicamente esto: https://gist.github.com/2373159 .
Cuando ejecuto grunt watch
, y guardo un archivo en test/cases/controller/*.coffee
, compila todos los archivos coincidentes (poniéndolos en tmp/*
).
¿Cómo se puede compilar el archivo modificado utilizando gruñido?
El próximo (y actualmente en desarrollo) v0.4.0a tiene el objeto grunt.file.watchFiles , que fue diseñado expresamente para este propósito. El plugin grunt-coffee puede haber agregado soporte para esta característica, no estoy seguro.
De cualquier manera, si está interesado en probar una versión en desarrollo de gruñido en su proyecto, consulte el ¿ Cuándo podré usar la función en desarrollo ''X''? Entrada de preguntas frecuentes
En este tema , Kyle Robinson sugiere usar el evento de watch
. Es muy importante establecer la propiedad watch watch de nospawn
en true
para que funcione. Modifiqué su solución para ejecutar selectivamente las tareas:
grunt.event.on(''watch'', function(action, filepath) {
if (minimatch(filepath, grunt.config(''watch.stylesheets.files''))) {
grunt.config(''compass.dist.options.specify'', [filepath]);
}
if (minimatch(filepath, grunt.config(''watch.scripts.files''))) {
var uglifySrc = filepath.replace(grunt.config(''uglify.dist.cwd''), '''');
grunt.config(''jshint.dist.src'', [filepath]);
grunt.config(''uglify.dist.src'', [uglifySrc]);
}
});
Aquí está la solución completa: https://gist.github.com/luissquall/5408257
La tarea grunt-contrib-watch ahora es compatible con esto.
https://npmjs.org/package/grunt-contrib-watch -> busque "Compilación de archivos según sea necesario"
grunt.initConfig({
watch: {
scripts: {
files: [''lib/*.js''],
tasks: [''jshint''],
options: {
nospawn: true,
},
},
},
jshint: {
all: [''lib/*.js''],
},
});
// on watch events configure jshint:all to only run on changed file
grunt.event.on(''watch'', function(action, filepath) {
grunt.config([''jshint'', ''all''], filepath);
});
Esto debería evitar que las tareas compilen todos los archivos cada vez que algo cambie.
Lo hice funcionar al compilar mis menos archivos. Debería poder jugar un poco con esta configuración para que funcione con el complemento coffeescript. La parte de interés es grunt.event.on(''watch'', ...)
. En este controlador de eventos estoy actualizando la propiedad de files
en el comando less para que solo contenga el archivo modificado.
path = require(''path'');
module.exports = function(grunt) {
// Project configuration.
grunt.initConfig({
pkg: grunt.file.readJSON(''package.json''),
less: {
development: {
options: {
paths: ["./library/less"],
},
files: [
{ src: "./library/less/bootstrap.less", dest: "./library/css/bootstrap.css"},
{ src: "./library/less/app.less", dest: "./library/css/app.css"}
]
}
},
watch: {
styles: {
files: "./library/less/*",
tasks: ["less"],
options: {
nospawn: true,
},
},
},
});
// Event handling
grunt.event.on(''watch'', function(action, filepath){
// Update the config to only build the changed less file.
grunt.config([''less'', ''development'', ''files''], [
{src: filepath, dest: ''./library/css/'' + path.basename(filepath, ''.less'') + ''.css''}
]);
});
// Load the plugins
grunt.loadNpmTasks(''grunt-contrib-less'');
grunt.loadNpmTasks(''grunt-contrib-watch'');
// Tasks
grunt.registerTask(''default'', [''watch'']);
};
Ninguna de estas respuestas funcionó muy bien para mí. Aquí está mi solución si alguien está interesado (sé que llego un poco tarde respondiendo a esta pregunta).
Tan nuevo para Grunt 0.4 son tareas más nombradas
Déjanos darte un ejemplo!
watch: {
package1: {
files: [
''./modules/package1/**/*.coffee''
],
tasks: [''coffee:package3'']
},
package2: {
files: [
''./test_packages/package2/**/*.coffee''
],
tasks: [''coffee:package3'']
},
package3: {
files: [
''./test_packages/package3/**/*.coffee''
],
tasks: [''coffee:package3'']
},
}
Para ejecutar todas esas tareas de vigilancia, simplemente haz grunt.registerTask (''predeterminado'', [''myInitialBuild'', ''watch'']);
Donde myInitialBuild
es cualquier compilación inicial (todos los archivos) luego seguir con un reloj en cada paquete. En realidad, puedes hacer esto para cada archivo, pero suena desagradable.
https://github.com/tschaub/grunt-newer parece exactamente para tareas similares:
Configure las tareas de Grunt para que se ejecuten solo con archivos más nuevos.
Sinopsis: la tarea más nueva configurará otra tarea para ejecutar con archivos src que sean a) más nuevos que los archivos dest o b) más nuevos que la última ejecución exitosa (si no hay archivos dest). Vea a continuación ejemplos y más detalles.
Puede anteponer fácilmente a cualquier tarea. En tu caso:
grunt.loadNpmTasks(''grunt-newer'');
grunt.registerTask(''default'', ''newer:coffee'');