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 :).
Creo que Grunt-Notify haría lo que estás buscando.
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