no trecho como este:
gulp.task "coffee", ->
gulp.src("src/server/**/*.coffee")
.pipe(coffee {bare: true}).on("error",gutil.log)
.pipe(gulp.dest "bin")
gulp.task "clean",->
gulp.src("bin", {read:false})
.pipe clean
force:true
gulp.task 'develop',['clean','coffee'], ->
console.log "run something else"
Na develop
tarefa que quero executar, clean
e depois que estiver pronto, execute coffee
e, quando terminar, execute outra coisa. Mas não consigo descobrir isso. Esta peça não funciona. Por favor informar.
javascript
node.js
coffeescript
gulp
iLemming
fonte
fonte
run-sequence
obsoletas - veja a resposta de massanishi abaixoRespostas:
Ainda não é um lançamento oficial, mas o Gulp 4.0 a seguir permite executar tarefas síncronas com facilidade com o gulp.series. Você pode simplesmente fazer assim:
Encontrei um bom post sobre como atualizar e fazer uso desses recursos legais: migrando para o gulp 4 por exemplo
fonte
gulp.task('coffee', ['clean'], function(){...}); gulp.task('develop', ['coffee']);
Por padrão, o gulp executa tarefas simultaneamente, a menos que tenham dependências explícitas. Isso não é muito útil para tarefas como
clean
, nas quais você não deseja depender, mas precisa que elas sejam executadas antes de tudo.Eu escrevi o
run-sequence
plugin especificamente para corrigir esse problema com o gulp. Depois de instalá-lo, use-o assim:Você pode ler as instruções completas no pacote README - ele também suporta a execução de alguns conjuntos de tarefas simultaneamente.
Observe que isso será (efetivamente) corrigido na próxima versão principal do gulp , pois eles eliminam completamente a ordem automática de dependência e fornecem ferramentas semelhantes a
run-sequence
para permitir que você especifique manualmente a ordem de execução como desejar.No entanto, essa é uma grande mudança, por isso não há razão para esperar quando você pode usar
run-sequence
hoje.fonte
gulp-clean
plug - in não estava implementando o Streams 2, portanto, havia problemas sendo executados como dependências. Isso foi corrigido na versão 0.3.0, meu colega de trabalho enviou um PR para convertê-lo.run-sequence
resolve uma parte crítica da funcionalidade ausente no gulp.A única boa solução para esse problema pode ser encontrada na documentação do gulp, que pode ser encontrada aqui
fonte
ReferenceError: err is not defined
tentando executar isso em umagulp-compass
tarefa, estou perdendo alguma coisa?return gulp.src('app/**/*.js').pipe(concat(app.js)).pipe(gulp.dest('app/scripts');
, a chave é identificar a tarefa 1 como dependente ao definir a tarefa 2: agulp.task('two', ['one'], function() {...
tarefa 2 agora aguardará a conclusão da tarefa 1 antes da execução.Eu criei um aplicativo node / gulp usando o gerador Yeoman do generator-gulp-webapp . Ele lidou com o "enigma limpo" dessa maneira (traduzindo para as tarefas originais mencionadas na pergunta):
fonte
gulp.start()
, esta resposta do membro gole explica que:gulp.start is undocumented on purpose because it can lead to complicated build files and we don't want people using it
(fonte: github.com/gulpjs/gulp/issues/426#issuecomment-41208007 )coffee
tarefa foi concluída? Se eu não detectá-lo,develop
tarefa vai terminar mais cedo do quecoffee
run-sequence
código fonte:gulp.on('task_stop')
. Veja minha resposta estendida para obter detalhes: stackoverflow.com/a/38818657/3027390A sequência de execução é a maneira mais clara (pelo menos até o Gulp 4.0 ser lançado)
Com a sequência de execução , sua tarefa ficará assim:
Mas se você (por algum motivo) preferir não usá-lo, o
gulp.start
método ajudará :Nota: Se você iniciar a tarefa apenas sem ouvir o resultado, a
develop
tarefa será concluída mais cedocoffee
e isso pode ser confuso.Você também pode remover o ouvinte de eventos quando não for necessário
Considere que também há um
task_err
evento que você pode querer ouvir.task_stop
é acionado na conclusão bem-sucedida, enquantotask_err
aparece quando há algum erro.Você também pode se perguntar por que não há documentação oficial para
gulp.start()
. Esta resposta do membro gulp explica o seguinte:(fonte: https://github.com/gulpjs/gulp/issues/426#issuecomment-41208007 )
fonte
De acordo com os documentos Gulp:
Para executar sua sequência de tarefas de forma síncrona:
gulp.src
) paragulp.task
para informar a tarefa de quando o fluxo termina.gulp.task
.Veja o código revisado:
fonte
Eu estava tendo exatamente o mesmo problema e a solução acabou sendo muito fácil para mim. Altere basicamente o seu código para o seguinte e ele deve funcionar. NOTA: o retorno antes do gulp.src fez toda a diferença para mim.
fonte
tentei todas as soluções propostas, todas parecem ter problemas próprios.
Se você realmente procurar a fonte do Orchestrator, particularmente a
.start()
implementação, verá que, se o último parâmetro for uma função, ele será tratado como um retorno de chamada.Eu escrevi este trecho para minhas próprias tarefas:
fonte
Eu estava procurando por essa resposta por um tempo. Agora eu peguei isso na documentação oficial do gulp.
Se você deseja executar uma tarefa gulp quando a última estiver concluída, você deve retornar um fluxo:
fonte
Basta fazer
coffee
dependerclean
edevelop
depender decoffee
:A expedição agora é serial:
clean
→coffee
→develop
. Observe queclean
a implementação ecoffee
a implementação devem aceitar um retorno de chamada "para que o mecanismo saiba quando será feito" :Em conclusão, abaixo está um padrão simples de gulp para um síncrono
clean
seguido por dependências de construção assíncronas :O Gulp é inteligente o suficiente para executar
clean
exatamente uma vez porbuild
, independentemente de quantasbuild
dependências dependamclean
. Como escrito acima,clean
é uma barreira de sincronização, então todasbuild
as dependências são executadas em paralelo e depoisbuild
executadas.fonte
Para mim, não estava executando a tarefa minify após a concatenação, pois espera uma entrada concatenada e não foi gerada algumas vezes.
Tentei adicionar a uma tarefa padrão em ordem de execução e ela não funcionou. Funcionou depois de adicionar apenas um
return
para cada tarefa e obter a minificação dentro,gulp.start()
como abaixo.Fonte http://schickling.me/synchronous-tasks-gulp/
fonte
Gulp e Node usam promessas .
Então você pode fazer isso:
Se você retornar o fluxo gulp, poderá usar o
then()
método para adicionar um retorno de chamada. Como alternativa, você pode usar o nativo do NodePromise
para criar suas próprias promessas. Aqui eu usoPromise.all()
para ter um retorno de chamada que é acionado quando todas as promessas são resolvidas.fonte
Tente este hack :-) Gulp v3.x Hack for Async bug
Eu tentei de todas as maneiras "oficiais" no Leiame, elas não funcionaram para mim, mas funcionou. Você também pode atualizar para o gulp 4.x, mas eu recomendo que não, pois quebra muitas coisas. Você pode usar uma promessa js real, mas, ei, isso é rápido, sujo, simples :-) Basicamente, você usa:
Confira o post!
fonte