Estou executando o gulp 3.6.2 e tenho a seguinte tarefa que foi configurada a partir de uma amostra 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']);
});
Sempre que há um erro no meu relógio de gole do CoffeeScript para - obviamente não é o que eu quero.
Como recomendado em outro lugar, tentei isso
gulp.watch(['./app/**/*.coffee'],['scripts']).on('error', swallowError);
gulp.watch('./app/**/*.scss',['scss']).on('error', swallowError);
function swallowError (error) { error.end(); }
mas não parece funcionar.
O que estou fazendo de errado?
Em resposta à resposta do @ Aperçu, modifiquei meu swallowError
método e tentei o seguinte:
gulp.task('scripts', function () {
gulp.src('./app/script/*.coffee')
.pipe(coffee({ bare: true }))
.pipe(gulp.dest('./public/js'))
.on('error', swallowError);
});
Reiniciou e, em seguida, criou um erro de sintaxe no meu arquivo de café. O mesmo 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)
Respostas:
Sua
swallowError
função deve ficar assim:Eu acho que você deve vincular essa função no
error
evento da tarefa que estava caindo, e não nawatch
tarefa, porque não é aí que surge o problema, você deve definir esse retorno de chamada de erro em cada tarefa que possa falhar, como plug-ins que quebram quando você tiver perdeu uma;
ou outra coisa, para impedir que awatch
tarefa pare.Exemplos :
Como alternativa, se você não se importa de incluir outro módulo, pode usar a função log do gulp-util para impedir que você declare uma função extra no seu
gulpfile
:Mas eu recomendo dar uma olhada no incrível plugin gulp-plumber , que é usado para remover o
onerror
manipulador doerror
evento, causando a interrupção dos fluxos. É muito simples de usar e impede que você pegue todas as tarefas que podem falhar.Mais informações sobre este artigo pelo criador do plugin em questão.
fonte
gulp.watch()
que adiciona um.on('error', function() { this.emit('end') })
resultado à função de observação, pois é especificamente a tarefa de observação que eu quero tornar resiliente a desligar. Funciona muito bem e as tarefas individuais que falham ainda imprimem suas próprias mensagens de erro. Veja o código: github.com/specious/specious.github.io/commit/f8571d28Os exemplos acima não funcionaram para mim. No entanto, o seguinte:
fonte
Com um formato de arquivo
(ex: *. somente café)
Se você deseja trabalhar apenas com um formato de arquivo, então
gulp-plumber
é a sua solução.Por exemplo, erros manipulados avançados e aviso para coffeescripting:
Com vários tipos de formatos de arquivo
(ex: * .coffee e * .js ao mesmo tempo)
Mas se você não trabalhar com vários tipos de formatos de arquivo (por exemplo:
*.js
e*.coffee
), postarei minha solução.Vou apenas postar um código auto-explicativo aqui, com alguma descrição antes.
Eu enfrentei o problema com
gulp-plumber
egulp-if
usandogulp.watch(...
Veja o problema relacionado aqui: https://github.com/floatdrop/gulp-plumber/issues/23
Então a melhor opção para mim foi:
merge-stream
(que foram feitos a partir deevent-stream
) em um e continuar o trabalho (tentei isso primeiro e funcionou bem para mim, por isso é uma solução mais rápida que a anterior)Cada parte como fluxo e mescla fluxos após
Ela é a parte principal do meu código:
Cada parte como arquivo e concatenada após
Para separar isso em partes, em cada parte deve haver um arquivo de resultado criado. Por exemplo:
PS:
Aqui módulos e funções do nó que foram usados:
fonte
Eu gosto de usar o encanador gulp porque ele pode adicionar um ouvinte global a uma tarefa e exibir uma mensagem significativa.
Referência: https://scotch.io/tutorials/prevent-errors-from-crashing-gulp-watch
fonte
Eu implementei o seguinte hack como uma solução alternativa para https://github.com/gulpjs/gulp/issues/71 :
Adicione-o ao seu gulpfile.js e use-o assim:
Parece o mais natural tratamento de erros para mim. Se não houver nenhum manipulador de erros, ele lançará um erro. Testado com o nó v0.11.13.
fonte
Uma solução simples para isso é colocar
gulp watch
um loop infinito dentro de um shell Bash (ou sh).while true; do gulp; gulp watch; sleep 1; done
Mantenha a saída desse comando em uma área visível na tela enquanto edita seu JavaScript. Quando suas edições resultam em um erro, o Gulp falha, imprime seu rastreamento de pilha, aguarde um segundo e retome a visualização dos arquivos de origem. Você pode então corrigir o erro de sintaxe e o Gulp indicará se a edição foi ou não bem-sucedida, imprimindo sua saída normal ou travando (e continuando) novamente.
Isso funcionará em um terminal Linux ou Mac. Se você estiver usando o Windows, use Cygwin ou Ubuntu Bash (Windows 10).
fonte
gulp watch
.Texto datilografado
Isto é o que funcionou para mim. Eu trabalho com
Typescript
e separamos a função (para evitar confusão com athis
palavra - chave) para manipularless
. Isso funcionaJavascript
também.Agora, quando você
watch
.less
arquivar eerror
ocorrer um , o arquivowatch
não será interrompido e as novas alterações serão processadas conforme o seuless task
.NOTA : Eu tentei com
l.end();
; no entanto, não funcionou. No entanto,l.emit('end');
funciona totalmente.Espero que esta ajuda. Boa sorte.
fonte
Isso funcionou para mim ->
Acabei de adicionar a linha .on ('error', console.error.bind (console)), mas tive que executar o comando gulp como root. Estou executando o node gulp em um aplicativo php, de modo que tenho várias contas em um servidor, e foi por isso que encontrei o problema de quebra de gulp em erros de sintaxe, porque não estava executando o gulp como root ... Talvez encanador e alguns dos outras respostas aqui teriam funcionado para mim se eu corresse como root. Os nossos agradecimentos ao Código Accio https://www.youtube.com/watch?v=iMR7hq4ABOw pela resposta. Ele disse que, ao lidar com o erro, ajuda a determinar em qual linha o erro está e o que está no console, mas também impede que o gulp interrompa o erro de sintaxe. Ele disse que era uma espécie de correção leve, então não tenho certeza se funcionará para o que você está procurando. Solução rápida, no entanto, vale a pena tentar. Espero que isso ajude alguém!
fonte