en el fragmento así:
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"
En la develop
tarea que quiero ejecutar clean
y después de que esté hecho, ejecute coffee
y cuando haya terminado, ejecute otra cosa. Pero no puedo entender eso. Esta pieza no funciona. Por favor avise.
javascript
node.js
coffeescript
gulp
iLemming
fuente
fuente
run-sequence
obsoleto - vea la respuesta de massanishi a continuaciónRespuestas:
Todavía no es un lanzamiento oficial, pero el próximo Gulp 4.0 le permite realizar fácilmente tareas sincrónicas con gulp.series. Simplemente puedes hacerlo así:
Encontré una buena publicación de blog que presenta cómo actualizar y utilizar esas características interesantes: migrar a Gulp 4 por ejemplo
fuente
gulp.task('coffee', ['clean'], function(){...}); gulp.task('develop', ['coffee']);
Por defecto, gulp ejecuta tareas simultáneamente, a menos que tengan dependencias explícitas. Esto no es muy útil para tareas como
clean
, donde no desea depender, pero necesita que se ejecuten antes que todo lo demás.Escribí el
run-sequence
complemento específicamente para solucionar este problema con trago. Después de instalarlo, úsalo así:Puede leer las instrucciones completas en el paquete README: también admite ejecutar algunos conjuntos de tareas simultáneamente.
Tenga en cuenta que esto se solucionará (de manera efectiva) en la próxima versión principal de Gulp , ya que están eliminando por completo el orden de dependencia automático y proporcionando herramientas similares
run-sequence
para permitirle especificar manualmente el orden de ejecución como lo desee.Sin embargo, ese es un cambio importante, por lo que no hay razón para esperar cuando puede usarlo
run-sequence
hoy.fuente
gulp-clean
complemento no estaba implementando Streams 2, por lo que tenía problemas para ejecutarse como dependencias. Esto se ha solucionado a partir de la versión de lanzamiento 0.3.0, mi compañero de trabajo envió un RP para convertirlo.run-sequence
resuelve una pieza crítica de funcionalidad faltante en trago.La única buena solución a este problema se puede encontrar en la documentación de Gulp que se puede encontrar aquí.
fuente
ReferenceError: err is not defined
tratando de ejecutar esto en unagulp-compass
tarea, ¿me estoy perdiendo algo?return gulp.src('app/**/*.js').pipe(concat(app.js)).pipe(gulp.dest('app/scripts');
, la clave es identificar la tarea uno como dependiente al definir la tarea dos: lagulp.task('two', ['one'], function() {...
tarea dos ahora esperará a que termine la tarea uno antes de ejecutarse.Genere una aplicación de nodo / trago usando el generador Yeoman de generator -gulp-webapp . Manejó el "acertijo limpio" de esta manera (traduciéndose a las tareas originales mencionadas en la pregunta):
fuente
gulp.start()
, esta respuesta del miembro de Gulp explica que:gulp.start is undocumented on purpose because it can lead to complicated build files and we don't want people using it
(fuente: github.com/gulpjs/gulp/issues/426#issuecomment-41208007 )coffee
tarea ha finalizado? Si no lo detecto, ladevelop
tarea finalizará antes decoffee
run-sequence
código fuente:gulp.on('task_stop')
. Vea mi respuesta extendida para más detalles: stackoverflow.com/a/38818657/3027390La secuencia de ejecución es la forma más clara (al menos hasta que se publique Gulp 4.0)
Con la secuencia de ejecución , su tarea se verá así:
Pero si (por alguna razón) prefiere no usarlo, el
gulp.start
método ayudará :Nota: Si solo inicia la tarea sin escuchar el resultado, la
develop
tarea finalizará antescoffee
y eso puede ser confuso.También puede eliminar el detector de eventos cuando no sea necesario
Considere que también hay un
task_err
evento que tal vez quiera escuchar.task_stop
se activa al finalizar con éxito, mientrastask_err
aparece cuando hay algún error.También puede preguntarse por qué no hay documentación oficial para
gulp.start()
. Esta respuesta del miembro de Gulp explica las cosas:(fuente: https://github.com/gulpjs/gulp/issues/426#issuecomment-41208007 )
fuente
De acuerdo con los documentos de Gulp:
Para ejecutar su secuencia de tareas sincrónicamente:
gulp.src
) agulp.task
para informar a la tarea cuándo finaliza la secuencia.gulp.task
.Ver el código revisado:
fuente
Estaba teniendo exactamente el mismo problema y la solución resultó ser bastante fácil para mí. Básicamente cambie su código a lo siguiente y debería funcionar. NOTA: la devolución antes de gulp.src marcó la diferencia para mí.
fuente
Probé todas las soluciones propuestas, todas parecen tener problemas propios.
Si realmente busca en la fuente del orquestador, particularmente en la
.start()
implementación, verá que si el último parámetro es una función, lo tratará como una devolución de llamada.Escribí este fragmento para mis propias tareas:
fuente
Estuve buscando esta respuesta por un tiempo. Ahora lo tengo en la documentación oficial de Gulp.
Si desea realizar una tarea de trago cuando se complete la última, debe devolver una secuencia:
fuente
Simplemente haga
coffee
dependerclean
ydevelop
dependa decoffee
:El envío ahora es serial:
clean
→coffee
→develop
. Tenga en cuenta queclean
la implementación ycoffee
la implementación deben aceptar una devolución de llamada, "para que el motor sepa cuándo se realizará" :En conclusión, a continuación se muestra un patrón de trago simple para una
clean
dependencia de compilación síncrona seguida de asíncrona :Gulp es lo suficientemente inteligente como para ejecutarse
clean
exactamente una vez por cada unobuild
, sin importar de cuántasbuild
dependencias dependanclean
. Como se escribió anteriormente,clean
es una barrera de sincronización, entonces todasbuild
las dependencias se ejecutan en paralelo, luego sebuild
ejecuta.fuente
Para mí, no estaba ejecutando la tarea minify después de la concatenación, ya que espera una entrada concatenada y no se generó algunas veces.
Intenté agregar a una tarea predeterminada en orden de ejecución y no funcionó. Funcionó después de agregar solo un
return
para cada tarea y obtener la minificación dentrogulp.start()
como se muestra a continuación.Fuente http://schickling.me/synchronous-tasks-gulp/
fuente
Gulp y Node usan promesas .
Entonces puedes hacer esto:
Si devuelve la secuencia de trago, puede usar el
then()
método para agregar una devolución de llamada. Alternativamente, puede usar el nativo de NodePromise
para crear sus propias promesas. Aquí solíaPromise.all()
tener una devolución de llamada que se activa cuando se resuelven todas las promesas.fuente
Prueba este truco :-) Gulp v3.x Hack para error asíncrono
Probé todas las formas "oficiales" en el archivo Léame, no funcionaron para mí, pero esto sí. También puede actualizar a Gulp 4.x, pero le recomiendo que no lo haga, rompe muchas cosas. Podría usar una promesa js real, pero bueno, esto es rápido, sucio, simple :-) Esencialmente usa:
¡Mira la publicación!
fuente