J'exécute gulp 3.6.2 et j'ai la tâche suivante qui a été configurée à partir d'un exemple en ligne
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']);
});
Chaque fois qu'il y a une erreur dans ma montre CoffeeScript gulp s'arrête - évidemment pas ce que je veux.
Comme recommandé ailleurs, j'ai essayé ceci
gulp.watch(['./app/**/*.coffee'],['scripts']).on('error', swallowError);
gulp.watch('./app/**/*.scss',['scss']).on('error', swallowError);
function swallowError (error) { error.end(); }
mais cela ne semble pas fonctionner.
Qu'est-ce que je fais mal?
En réponse à la réponse de @ Aperçu, j'ai modifié ma swallowError
méthode et essayé ce qui suit à la place:
gulp.task('scripts', function () {
gulp.src('./app/script/*.coffee')
.pipe(coffee({ bare: true }))
.pipe(gulp.dest('./public/js'))
.on('error', swallowError);
});
Redémarré, puis créé une erreur de syntaxe dans mon fichier café. Même problème:
[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)
Réponses:
Votre
swallowError
fonction devrait ressembler à ceci:Je pense que vous devez lier cette fonction à l'
error
événement de la tâche qui tombait, pas à lawatch
tâche, car ce n'est pas de là que vient le problème, vous devez définir ce rappel d'erreur sur chaque tâche qui peut échouer, comme les plugins qui se cassent lorsque vous avez manqué un;
ou autre chose, pour éviterwatch
tâche de s'arrêter.Exemples :
Sinon, si cela ne vous dérange pas d'inclure un autre module, vous pouvez utiliser la fonction log de gulp-util pour vous empêcher de déclarer une fonction supplémentaire dans votre
gulpfile
:Mais je peux recommander de jeter un coup d'œil à l'impressionnant plombier plugin , qui est utilisé pour supprimer le
onerror
gestionnaire de l'error
événement, provoquant la rupture des flux. C'est très simple à utiliser et cela vous empêche d'attraper toutes les tâches qui peuvent échouer.Plus d'infos à ce sujet sur cet article du créateur du plugin concerné.
la source
gulp.watch()
qui ajoute un.on('error', function() { this.emit('end') })
au résultat de la fonction de montre, car c'est spécifiquement la tâche de montre que je veux rendre résiliente à raccrocher. Fonctionne très bien et les tâches individuelles qui échouent impriment toujours leurs propres messages d'erreur. Voir le code: github.com/specious/specious.github.io/commit/f8571d28Les exemples ci-dessus n'ont pas fonctionné pour moi. Ce qui suit cependant:
la source
Avec un format de fichiers
(ex: * .coffee uniquement)
Si vous souhaitez travailler uniquement avec un seul format de fichiers, alors
gulp-plumber
est votre solution.Par exemple, les erreurs de gestion enrichie et les avertissements pour le script café:
Avec plusieurs types de formats de fichiers
(ex: * .coffee et * .js en même temps)
Mais si vous ne travaillez pas avec plusieurs types de formats de fichiers (par exemple:
*.js
et*.coffee
), je publierai ma solution.Je vais juste poster un code explicite ici, avec une description avant.
J'ai rencontré le problème avec
gulp-plumber
et engulp-if
utilisantgulp.watch(...
Voir le problème associé ici: https://github.com/floatdrop/gulp-plumber/issues/23
La meilleure option pour moi était donc:
merge-stream
(qui a été créé à partir deevent-stream
) en un seul et continuez le travail (j'ai essayé cela en premier, et cela fonctionne bien pour moi, donc c'est une solution plus rapide que la précédente)Chaque partie en tant que flux, et fusionne les flux après
Elle est la partie principale de mon code:
Chaque partie en tant que fichier, et concaténée après
Si vous devez séparer cela en parties, dans chaque partie, un fichier de résultat doit être créé. Par exemple:
PS:
Voici les modules et fonctions de nœud qui ont été utilisés:
la source
J'aime utiliser gulp plumber car il peut ajouter un auditeur global à une tâche et afficher un message significatif.
Référence: https://scotch.io/tutorials/prevent-errors-from-crashing-gulp-watch
la source
J'ai implémenté le hack suivant comme solution de contournement pour https://github.com/gulpjs/gulp/issues/71 :
Ajoutez-le à votre gulpfile.js et utilisez-le comme ça:
Cela me semble être la gestion des erreurs la plus naturelle. S'il n'y a pas du tout de gestionnaire d'erreur, une erreur est générée. Testé avec Node v0.11.13.
la source
Une solution simple à cela est de mettre
gulp watch
dans une boucle infinie dans un shell Bash (ou sh).while true; do gulp; gulp watch; sleep 1; done
Conservez la sortie de cette commande dans une zone visible de votre écran lorsque vous modifiez votre JavaScript. Lorsque vos modifications entraînent une erreur, Gulp plante, imprime sa trace de pile, attend une seconde et reprend la surveillance de vos fichiers source. Vous pouvez ensuite corriger l'erreur de syntaxe, et Gulp indiquera si la modification a réussi ou non en imprimant sa sortie normale ou en plantant (puis en reprenant).
Cela fonctionnera dans un terminal Linux ou Mac. Si vous utilisez Windows, utilisez Cygwin ou Ubuntu Bash (Windows 10).
la source
gulp watch
.Manuscrit
C'est ce qui a fonctionné pour moi. Je travaille avec
Typescript
et sépare la fonction (pour éviter toute confusion avec lethis
mot-clé) à gérerless
. Cela fonctionne également avecJavascript
.Désormais, lorsque vous
watch
.less
enregistrez des fichiers et que celaerror
se produit, lewatch
ne s'arrêtera pas et les nouvelles modifications seront traitées selon votreless task
.REMARQUE : j'ai essayé avec
l.end();
; cependant, cela n'a pas fonctionné. cependant,l.emit('end');
fonctionne totalement.J'espère que cette aide. Bonne chance.
la source
Cela a fonctionné pour moi ->
Je viens d'ajouter la ligne .on ('error', console.error.bind (console)), mais j'ai dû exécuter la commande gulp en tant que root. J'exécute node gulp sur une application php donc j'ai plusieurs comptes sur un serveur, c'est pourquoi j'ai rencontré le problème de la rupture de gulp sur les erreurs de syntaxe parce que je n'utilisais pas gulp en tant que root ... Peut-être plombier et certains des d'autres réponses ici auraient fonctionné pour moi si j'avais couru en tant que root. Crédit à Accio Code https://www.youtube.com/watch?v=iMR7hq4ABOw pour la réponse. Il a dit qu'en gérant l'erreur, cela vous aide à déterminer sur quelle ligne se trouve l'erreur et ce qu'elle est dans la console, mais empêche également gulp de se rompre en cas d'erreur de syntaxe. Il a dit que c'était une sorte de solution légère, donc je ne sais pas si cela fonctionnera pour ce que vous recherchez. Solution rapide, ça vaut le coup. J'espère que cela aide quelqu'un!
la source