Estoy ejecutando gulp 3.6.2 y tengo la siguiente tarea que se configuró a partir de una muestra en línea
gulp.task('watch', ['default'], function () {
gulp.watch([
'views/**/*.html',
'public/**/*.js',
'public/**/*.css'
], function (event) {
return gulp.src(event.path)
.pipe(refresh(lrserver));
});
gulp.watch(['./app/**/*.coffee'],['scripts']);
gulp.watch('./app/**/*.scss',['scss']);
});
Cada vez que hay un error en mi reloj de CoffeeScript, obviamente no es lo que quiero.
Como se recomienda en otro lugar, probé esto
gulp.watch(['./app/**/*.coffee'],['scripts']).on('error', swallowError);
gulp.watch('./app/**/*.scss',['scss']).on('error', swallowError);
function swallowError (error) { error.end(); }
Pero no parece funcionar.
¿Qué estoy haciendo mal?
En respuesta a la respuesta de @ Aperçu, modifiqué mi swallowError
método e intenté lo siguiente:
gulp.task('scripts', function () {
gulp.src('./app/script/*.coffee')
.pipe(coffee({ bare: true }))
.pipe(gulp.dest('./public/js'))
.on('error', swallowError);
});
Reinicié y luego creé un error de sintaxis en mi archivo de café. Mismo problema:
[gulp] Finished 'scripts' after 306 μs
stream.js:94
throw er; // Unhandled stream error in pipe.
^
Error: W:\bariokart\app\script\trishell.coffee:5:1: error: unexpected *
*
^
at Stream.modifyFile (W:\bariokart\node_modules\gulp-coffee\index.js:37:33)
at Stream.stream.write (W:\bariokart\node_modules\gulp-coffee\node_modules\event-stream\node_modules\through\index.js:26:11)
at Stream.ondata (stream.js:51:26)
at Stream.EventEmitter.emit (events.js:95:17)
at queueData (W:\bariokart\node_modules\gulp\node_modules\vinyl-fs\node_modules\map-stream\index.js:43:21)
at next (W:\bariokart\node_modules\gulp\node_modules\vinyl-fs\node_modules\map-stream\index.js:71:7)
at W:\bariokart\node_modules\gulp\node_modules\vinyl-fs\node_modules\map-stream\index.js:85:7
at W:\bariokart\node_modules\gulp\node_modules\vinyl-fs\lib\src\bufferFile.js:8:5
at fs.js:266:14
at W:\bariokart\node_modules\gulp\node_modules\vinyl-fs\node_modules\graceful-fs\graceful-fs.js:104:5
at Object.oncomplete (fs.js:107:15)
Respuestas:
Su
swallowError
función debería verse así:Creo que debe vincular esta función en
error
caso de que la tarea se caiga, no lawatch
tarea, porque no es allí donde viene el problema, debe configurar esta devolución de llamada de error en cada tarea que puede fallar, como complementos que se rompen cuando tiene omitió una;
u otra cosa, para evitar que lawatch
tarea se detenga.Ejemplos:
Alternativamente, si no le importa incluir otro módulo, puede usar la función de registro de gulp-util para evitar que declare una función adicional en su
gulpfile
:Pero puedo recomendar echar un vistazo al impresionante plugin gulp-plumber , que se utiliza para eliminar el
onerror
controlador delerror
evento y provocar la interrupción de las transmisiones. Es muy simple de usar y evita que detecte todas las tareas que pueden fallar.Más información sobre esto en este artículo del creador del complemento en cuestión.
fuente
gulp.watch()
que agregue un.on('error', function() { this.emit('end') })
resultado al resultado de la función de reloj, ya que es específicamente la tarea de reloj que quiero hacer resistente para colgar. Funciona realmente bien, y las tareas individuales que fallan aún imprimen sus propios mensajes de error. Vea el código: github.com/specious/specious.github.io/commit/f8571d28Los ejemplos anteriores no me funcionaron. Lo siguiente hizo sin embargo:
fuente
Con un formato de archivos
(ej: * .café solamente)
Si desea trabajar solo con un formato de archivos, entonces
gulp-plumber
es su solución.Por ejemplo, errores manejados ricos y advertencias para coffeescripting:
Con múltiples tipos de formatos de archivo
(ej: * .coffee y * .js al mismo tiempo)
Pero si no quiere trabajar con múltiples tipos de formatos de archivo (por ejemplo:
*.js
y*.coffee
), entonces publicaré mi solución.Voy a publicar un código autoexplicativo aquí, con alguna descripción antes.
Me enfrenté al problema con
gulp-plumber
ygulp-if
usandogulp.watch(...
Vea el problema relacionado aquí: https://github.com/floatdrop/gulp-plumber/issues/23
Entonces la mejor opción para mí fue:
merge-stream
(que se hizo deevent-stream
) en una y continúe el trabajo (lo intenté primero, y funciona bien para mí, por lo que es una solución más rápida que la anterior)Cada parte como secuencia y fusionar secuencias después
Ella es la parte principal de mi código:
Cada parte como archivo y concatenar después
Si para separar esto en partes, entonces en cada parte debe haber un archivo de resultados creado. Por ej .:
PD:
Aquí los módulos de nodo y las funciones que se utilizaron:
fuente
Me gusta usar gulp plumber porque puede agregar un oyente global a una tarea y mostrar un mensaje significativo.
Referencia: https://scotch.io/tutorials/prevent-errors-from-crashing-gulp-watch
fuente
He implementado el siguiente hack como solución alternativa para https://github.com/gulpjs/gulp/issues/71 :
Añádelo a tu gulpfile.js y úsalo así:
Esto se siente como el manejo de errores más natural para mí. Si no hay ningún controlador de errores, arrojará un error. Probado con el nodo v0.11.13.
fuente
Una solución simple a esto es poner
gulp watch
un bucle infinito dentro de un shell Bash (o sh).while true; do gulp; gulp watch; sleep 1; done
Mantenga la salida de este comando en un área visible en su pantalla mientras edita su JavaScript. Cuando sus ediciones den como resultado un error, Gulp se bloqueará, imprimirá su seguimiento de la pila, esperará un segundo y continuará viendo sus archivos fuente. Luego puede corregir el error de sintaxis, y Gulp indicará si la edición fue exitosa o no imprimiendo su salida normal o bloqueándose (luego reanudando) nuevamente.
Esto funcionará en un terminal Linux o Mac. Si está utilizando Windows, use Cygwin o Ubuntu Bash (Windows 10).
fuente
gulp watch
.Mecanografiado
Esto es lo que funcionó para mí. Trabajo
Typescript
y separé la función (para evitar la confusión con lathis
palabra clave) para manejarless
. Esto funciona conJavascript
también.Ahora, cuando presenta los
watch
.less
archivos, yerror
ocurre,watch
no se detendrá y se procesarán los nuevos cambios según suless task
.NOTA : probé con
l.end();
; Sin embargo, no funcionó. Sin embargo,l.emit('end');
funciona totalmente.Espero que esto ayude. Buena suerte.
fuente
Esto funcionó para mí ->
Acabo de agregar la línea .on ('error', console.error.bind (console)), pero tuve que ejecutar el comando gulp como root. Estoy ejecutando node gulp en una aplicación php, así que tengo varias cuentas en un servidor, por lo que me encontré con el problema de que Gulp se rompiera en los errores de sintaxis porque no estaba ejecutando gulp como root ... Tal vez fontanero y algunos de los otras respuestas aquí me habrían funcionado si me ejecutara como root. Acredite a Accio Code https://www.youtube.com/watch?v=iMR7hq4ABOw por la respuesta. Dijo que al manejar el error, le ayuda a determinar en qué línea se encuentra el error y en qué se encuentra en la consola, pero también evita que el trago se rompa en el error de sintaxis. Dijo que era una solución ligera, por lo que no estoy seguro de si funcionará para lo que está buscando. Solución rápida, sin embargo, vale la pena intentarlo. ¡Espero que esto ayude a alguien!
fuente