接触Gulp几个月了,对这款构建工具也愈来愈熟悉。因而逐渐发现了它的一些问题。css
设想如下常见场景,有以下三个task
:gulp
build
:用于编译Sass工具
compress
:用于压缩CSSui
release
:执行build
和compress
,编译Sass并压缩CSS命令行
这个场景十分常见,在开发环境下经过build
生成用户CSS进行调试,而在生产环境下则须要执行release
。调试
众所周知gulp.run
接口已经弃用,官方API只剩下gulp.src
,gulp.dest
,gulp.task
,gulp.watch
四个。task
的启动只能经过命令行或者gulp.watch
触发。code
幸运的是,尝试一下就会发现gulp.start
也是能够用于启动task
的。那么如上场景中的release
应该写成:接口
gulp.task('release', function() { gulp.start(['build', 'compress']); }
可是这样写明显是有问题的。因为gulp.start
并不是顺次同步启动列表中的task
,设想当build
耗时较长时,实际执行顺序可能将会是:开发
Starting 'release'... Starting 'build'... Starting 'compress'... Finishing 'build'... Finishing 'compress'... Finishing 'release'...
这样形成的问题是,compress
读取的CSS文件并不是最新编译生成的版本,所以压缩所得的min.css文件并非咱们想要的。同步
要解决这个问题,就必需要build
完成后才启动compress
,所以有以下写法:
gulp.task('release', ['build'], function() { gulp.start(['compress']); }
这样确实可以避免上述的问题,可是很明显语义上并不符合逻辑:
Starting 'build'... Finishing 'build'... Starting 'release'... Starting 'compress'... Finishing 'compress'... Finishing 'release'...
咱们想要的难道不该该是这样吗:
Starting 'release'... Starting 'build'... Finishing 'build'... Starting 'compress'... Finishing 'compress'... Finishing 'release'...
为了实现这个顺序,只有一种写法:
gulp.task('compress', ['build'], function () { // compress }); gulp.task('release', function () { gulp.start(['compress']); });
这样看起来就更奇怪了…compress
毫不应是依赖于build
的,而release
也毫不应是start compress
。
而就Gulp目前的语法来看,并无什么好的解决办法。
总的来讲,Gulp目前的语法并不能很好的支持语义化的构建流程。我所但愿的最好的解决方法是gulp.start
可以支持同步任务。