Używam gulp 3.6.2 i mam następujące zadanie, które zostało skonfigurowane na podstawie próbki online
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']);
});
Za każdym razem, gdy pojawia się błąd w moim zegarku z kawą CoffeeScript, zatrzymuje się - oczywiście nie to, czego chcę.
Zgodnie z zaleceniami gdzie indziej próbowałem tego
gulp.watch(['./app/**/*.coffee'],['scripts']).on('error', swallowError);
gulp.watch('./app/**/*.scss',['scss']).on('error', swallowError);
function swallowError (error) { error.end(); }
ale wydaje się, że nie działa.
Co ja robię źle?
W odpowiedzi na odpowiedź @ Aperçu zmodyfikowałem swoją swallowError
metodę i spróbowałem zamiast tego:
gulp.task('scripts', function () {
gulp.src('./app/script/*.coffee')
.pipe(coffee({ bare: true }))
.pipe(gulp.dest('./public/js'))
.on('error', swallowError);
});
Uruchomiono ponownie, a następnie utworzyłem błąd składni w moim pliku kawy. Ten sam problem:
[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)
Odpowiedzi:
Twoja
swallowError
funkcja powinna wyglądać następująco:Myślę, że musisz powiązać tę funkcję ze
error
zdarzeniem zadania, które spadało, a nie zwatch
zadaniem, ponieważ nie jest to miejsce, w którym pojawia się problem, powinieneś ustawić ten błąd zwrotny dla każdego zadania, które może się nie powieść, jak wtyczki, które psują się, gdy masz przegapiłeś;
coś lub coś innego, aby zapobiecwatch
zatrzymaniu zadania.Przykłady:
Alternatywnie, jeśli nie masz nic przeciwko dołączeniu innego modułu, możesz użyć funkcji dziennika gulp-util, aby nie zadeklarować dodatkowej funkcji w swoim
gulpfile
:Ale mogę polecić przyjrzenie się niesamowitej wtyczce gulp-plumber , która służy do usuwania programu
onerror
obsługierror
zdarzenia, powodując przerwanie strumieni. Jest bardzo prosty w użyciu i zapobiega przechwytywaniu wszystkich zadań, które mogą się nie powieść.Więcej informacji na ten temat w tym artykule autora danej wtyczki.
źródło
gulp.watch()
które dodaje efekt.on('error', function() { this.emit('end') })
do wyniku działania funkcji zegarka, ponieważ jest to szczególnie zadanie zegarka, które chcę uodpornić na zawieszanie się. Działa naprawdę dobrze, a poszczególne zadania, które kończą się niepowodzeniem, nadal wyświetlają własne komunikaty o błędach. Zobacz kod: github.com/specious/specious.github.io/commit/f8571d28Powyższe przykłady nie działają dla mnie. Jednak zrobili to:
źródło
Z jednym formatem plików
(np .: *. tylko kawa)
Jeśli chcesz pracować tylko z jednym formatem plików, to
gulp-plumber
jest Twoje rozwiązanie.Na przykład bogate obsługiwane błędy i ostrzeżenia dotyczące tworzenia skryptów kawowych:
Z wieloma typami formatów plików
(np. * .coffee i * .js w tym samym czasie)
Ale jeśli nie będziesz pracować z wieloma typami formatów plików (na przykład:
*.js
i*.coffee
), opublikuję moje rozwiązanie.Po prostu opublikuję tutaj kod, który nie wymaga objaśnień, z pewnym opisem wcześniej.
Zmierzyłem się z problemem
gulp-plumber
igulp-if
używamgulp.watch(...
Zobacz powiązany problem tutaj: https://github.com/floatdrop/gulp-plumber/issues/23
Więc najlepszą opcją dla mnie było:
merge-stream
(który został utworzonyevent-stream
) w jeden i kontynuuj pracę (próbowałem tego jako pierwszy i działa dobrze, więc jest to szybsze rozwiązanie niż poprzedni)Każda część jako strumień i połącz strumienie po
Ona jest główną częścią mojego kodu:
Każda część jako plik i połączona później
Aby podzielić to na części, to w każdej części powinien być utworzony plik wynikowy. Na przykład:
PS:
Tutaj moduły węzłów i funkcje, które zostały użyte:
źródło
Lubię używać hydraulika Gulp, ponieważ może on dodać do zadania globalnego nasłuchiwania i wyświetlić znaczący komunikat.
Źródła: https://scotch.io/tutorials/prevent-errors-from-crashing-gulp-watch
źródło
Zaimplementowałem następujący hack jako obejście dla https://github.com/gulpjs/gulp/issues/71 :
Dodaj go do swojego pliku gulpfile.js i używaj go w ten sposób:
Wydaje mi się, że jest to najbardziej naturalna obsługa błędów. Jeśli w ogóle nie ma programu obsługi błędów, zgłosi błąd. Testowane z Node v0.11.13.
źródło
Prostym rozwiązaniem tego jest umieszczenie
gulp watch
nieskończonej pętli w powłoce Bash (lub sh).while true; do gulp; gulp watch; sleep 1; done
Utrzymuj wynik tego polecenia w widocznym obszarze na ekranie podczas edytowania kodu JavaScript. Kiedy Twoje zmiany spowodują błąd, Gulp ulegnie awarii, wydrukuje ślad stosu, odczekaj sekundę i wznowi oglądanie plików źródłowych. Następnie możesz poprawić błąd składni, a Gulp wskaże, czy edycja zakończyła się sukcesem, albo drukując normalne wyjście, albo ponownie zawieszając się (i wznawiając).
To zadziała w terminalu Linux lub Mac. Jeśli używasz systemu Windows, użyj Cygwin lub Ubuntu Bash (Windows 10).
źródło
gulp watch
.Maszynopis
To właśnie zadziałało dla mnie. Pracuję z
Typescript
funkcją i oddzielałem ją (aby aovid pomieszanie zethis
słowem kluczowym) do obsługiless
. Działa toJavascript
również z.Teraz, kiedy
watch
.less
pliki, a takżeerror
nastąpi,watch
nie będzie zatrzymać i nowe zmiany będą przetwarzane jak na swojeless task
.UWAGA : próbowałem z
l.end();
; jednak to nie zadziałało. Jednakl.emit('end');
całkowicie działa.Mam nadzieję, że to pomoże. Powodzenia.
źródło
To zadziałało dla mnie ->
Właśnie dodałem wiersz .on ('błąd', console.error.bind (console)), ale musiałem uruchomić polecenie gulp jako root. Uruchamiam node gulp w aplikacji php, więc mam wiele kont na jednym serwerze, dlatego napotkałem problem zerwania łyka przy błędach składniowych, ponieważ nie uruchamiałem gulp jako root ... Może hydraulik i niektóre z inne odpowiedzi tutaj zadziałałyby, gdybym uruchomił się jako root. Kredyt dla Accio Code https://www.youtube.com/watch?v=iMR7hq4ABOw za odpowiedź. Powiedział, że obsługa błędu pomaga określić, w której linii znajduje się błąd i co znajduje się w konsoli, ale także zapobiega przełamywaniu się łyka po błędzie składni. Powiedział, że to trochę lekka poprawka, więc nie jestem pewien, czy zadziała w przypadku tego, czego szukasz. Szybka naprawa, warto spróbować. Mam nadzieję, że to komuś pomoże!
źródło