unable tutorial serve grunt fatal error javascript node.js gruntjs

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).

https://gist.github.com/ryansmith94/8569178


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'');