uglify serve nodejs grunt clean gruntjs watch

gruntjs - serve - Reloj Grunt: detecta el éxito y el fracaso de las tareas



nodejs grunt (2)

ACTUALIZAR

Actualmente estoy usando una solución similar a la que se describe aquí para las notificaciones de error, y la ''solución actual'' a continuación (sin modificar la opción de force grunt) para las notificaciones de éxito.

PREGUNTA ORIGINAL

Tengo problemas para determinar cuándo ha terminado (correctamente o no) una subtarea ejecutada por grunt-contrib-watch .

Específicamente, estoy usando grunt-contrib-coffee y grunt watch para compilar mis archivos CoffeeScript a medida que cambian. La compilación está funcionando bien.

Lo que me gustaría hacer es notificarme sobre el estado de la compilación. Esto es lo que he intentado (todo el código en CS):

Solución actual

Desde SO Pregunta ( ¿Cómo puedo hacer que una tarea de Grunt falle si falla una de sus tareas secundarias? )

Lo que no me gusta: configurar y restaurar una opción global parece torpe, especialmente porque está sucediendo en diferentes tareas / controladores de eventos. Además, tengo que eliminar el archivo de destino cada vez.

Sin configurar la opción global, puedo notificar a una compilación exitosa, lo cual es genial, pero me gustaría notificar a una falla también.

grunt.initConfig watch: options: nospawn: true coffee: files: ''<%= coffee.dev.cwd %>/<%= coffee.dev.src %>'' options: events: [''changed'', ''added''] coffee: dev: expand: true cwd: ''app'' src: ''**/*.coffee'' dest: ''public'' ext: ''.js'' grunt.registerTask ''completedCompile'', (srcFilePath, destFilePath) -> grunt.option ''force'', false if grunt.file.exists( destFilePath ) # notify success else # notify failure grunt.event.on ''watch'', (action, filepath) -> if grunt.file.isMatch grunt.config(''watch.coffee.files''), filepath filepath = # compose source filepath from config options (omitted) dest = # compose destination filepath from config options (omitted) if grunt.file.exists( dest ) grunt.file.delete dest # delete the destination file so we can tell in ''completedCompile'' whether or not ''coffee:dev'' was successful grunt.option ''force'', true # needed so ''completedCompile'' runs even if ''coffee:dev'' fails grunt.config ''coffee.dev.src'', filepath # compile just the one file, not all watched files grunt.task.run ''coffee:dev'' grunt.task.run ''completedCompile:''+filepath+'':''+dest # call ''completedCompile'' task with args

Otra opción (tan lenta)

Como lo sugirió otra pregunta de SO ( Gruntfile obtiene códigos de error de programas en serie ), utilicé grunt.util.spawn .

Esto funcionó, pero fue bastante lento (varios segundos cada vez que se guarda el archivo CS).

grunt.event.on ''watch'', (action, filepath) -> if grunt.file.isMatch grunt.config(''watch.coffee.files''), filepath filepath = # compose source filepath from config options (omitted) dest = # compose destination filepath from config options (omitted) if grunt.file.exists( dest ) grunt.file.delete dest # delete the destination file so we can tell in ''completedCompile'' whether or not ''coffee:dev'' was successful grunt.util.spawn { grunt: true # use grunt to spawn args: [''coffee:dev''] options: { stdio: ''inherit'' } # print to same stdout }, -> # coffee:dev finished if grunt.file.exists( dest ) # notify success else # notify error

Otros intentos

Intenté un montón de cosas.

  • grunt.fail.errorcount (cuando se usa en la tarea ''completedCompile'') no es cero si las compilaciones anteriores han fallado. (¿Es seguro restablecerlo manualmente a cero? En caso afirmativo, no tendría que eliminar el archivo de destino cada vez). Aún así, esto requiere establecer la opción global ''force'' en verdadero.
  • Cualquier cosa que implique especificar las opciones de ''watch.coffee.tasks'' en grunt.initConfig no funciona porque la tarea ''coffee: dev'' se ejecuta después de que el controlador de eventos ''watch'' se haya completado.
  • grunt.task.current siempre se refiere a la tarea de ''observación'', por supuesto



Si has llegado hasta aquí, gracias por leer :).



También he tenido el mismo problema, tratando de averiguar cuándo se completa una subtabla de vigilancia.

Parte del problema que parece es que Watch por defecto generará un nuevo proceso Grunt para ejecutar la subtarea. Entonces su proceso principal de Grunt no sabrá sobre las tareas que terminan. Puede configurar ''Nospawn'' pero esto no ayuda mucho ya que watch no expone la subtarea en sí.

Lo más cerca que pude llegar a esto fue utilizar Grunt.util.hooker (inspirado por Grunt Notify) para reaccionar cuando se llama al método Grunt fail ''report''.

grunt.util.hooker.hook(grunt.fail, ''report'', function(){});

Sin embargo, esto no contiene información sobre la tarea real completada, lo que sería útil si desea hacer algo en función de tareas secundarias específicas dentro de su tarea de vigilancia.

Mirando a Grunt Watch github, parece haber algo de tracción para implementar un evento completo / fallido: https://github.com/gruntjs/grunt-contrib-watch/issues/131