gulp顺序执行任务

gulp顺序执行任务

在gulp中定义多个任务,可能一个任务要依赖其他某个任务完全结束后才能开始进行,比如,我们先定义两个任务,一个coffee任务,一个clean任务,coffee用于编译coffee代码到js代码,clean用于清理已经编译的代码,在编译之前先clean一下:

gulp.task(‘coffee‘, function() {
    gulp.src(‘server/coffee/*.coffee‘)
        .pipe(coffee())
        .pipe(gulp.dest(‘server/js‘));
});
gulp.task(‘clean‘, function() {
    gulp.src([‘server/js/*.js‘])
        .pipe(clean());
});

在官方的文档中找到如下方式,在coffee任务中添加一个参数,标记该任务所依赖的其他任务,依赖的任务先于该任务执行:

gulp.task(‘coffee‘,[‘clean‘], function() {
    gulp.src(‘server/coffee/*.coffee‘)
        .pipe(coffee())
        .pipe(gulp.dest(‘server/js‘));
});

即,在coffee任务中添加一个任务依赖数组,数组里的任务clean要先执行,再执行任务coffee.

但是在实际操作中发现,如果文件特别多,还是会报错:

events.js:85
      throw er; // Unhandled ‘error‘ event
            ^
Error: ENOENT, stat ‘/home/coolcao/mycode/node/NutWeb/server/dao/blogDao.js‘
  at Error (native)

这令我不解,网上各种搜,都说这样做没问题,但我这里确实不行。

又不停的问了一下谷老师,最终找到问题了:

对’clean’定义的function而言,虽然函数本身已经执行完毕了,但是文件删除操作可能仍在进行 — gulp任务中的操作大多数都是数据流(Stream)的操作,其操作进度与函数执行无关。

如果需要在文件彻底清理后才开始执行’less’任务,则需要在’clean’任务中进行特殊编码:令其返回最终的数据流(Stream)对象:

gulp.task(‘clean‘, function() {
    return gulp.src([‘server/js/*.js‘])
            .pipe(clean());
});

对于数据流而言,代码语句的执行结束仅仅意味着数据操作的开始,唯一能确定数据操作结束的是最后一个数据流所触发的end事件;因此,只有想办法监听到这个end事件,才有可能实现真正意义上的任务依赖。而在任务定义的函数中返回最后一个数据流,是一个相对来说使用起来最方便的方案。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-17 18:09:36

gulp顺序执行任务的相关文章

多命令顺序执行,dd命令,管道|,grep,通配符

多命令顺序执行:命令1;命令2 命令之间没有逻辑关系 命令1&&命令2 命令1执行正确才执行命令2,命令1执行错误不会执行命令2 命令1||命令2 命令执行错误才执行命令2,命令1执行正确不会执行命令2 命令 && echo yes || echo no dd if=输入文件 of=输出文件 bs=字节数 count=个数 if=输入文件 指定源文件或源设备 of=输出文件 指定目标文件或目标设备 bs=字节数 指定一次输入/输出多少字节,即把这些字节看做一个数据块 cou

多命令顺序执行,单引号,双引号,反引号,转义符

多命令顺序执行 ; 多命令顺序执行 && 逻辑与 前命令执行ok,后面进行 || 逻辑或 前命令执行失败 后面执行 | 命令1|命令2 命令1结果,让命令来处理通配符 ?匹配任意一个字符 * 匹配0个或者多个任意字符 [] 匹配中括号中的任意一个字符 [-] 匹配括号中的任意一个字符 [^] 逻辑非 匹配不是中括号中的任意一个字符 [[email protected] biji]# aa=666 [[email protected] biji]# echo $aa #打印变量aa666[[

python多进程并行执行和顺序执行的时间测试

#_*_coding:utf-8_*_ import time from  multiprocessing import Pool from threading import Thread def func1(fn):     time.sleep(1)     return fn * fn if __name__ == "__main__":     a = [1,2,3,4,5,6]     print "顺序执行的方式开始..."     s = time.t

实现LoadRunner多个场景的顺序执行

实现LoadRunner多个场景的顺序执行 应用场景 假设有3个不同的测试场景,分别为并发登录.核心业务.可靠性测试,3个场景有先后执行顺序.由于白天测试机器另有用处,只能在晚上进行性能测试,这时我们的期望是能否把测试场景都设定好之后晚上自动运行,第二天我们回来看测试结果呢? 答案是肯定的,可以有两种方式实现. 第一种,相对简单充分利用LR Controller里面Group的功能. 新建一个场景把3个脚本都添加进来,在Edit Schedule中选择“Schedule by Group”的方式

[Shell]Bash基本功能:多命令顺序执行与管道符

/*----------------------------------------------------------------------------------------------- @黑眼诗人 <www.chenwei.ws> -----------------------------------------------------------------------------------------------*/ 一. 多命令顺序执行 分号(;)        逻辑与(&a

回溯法-01背包问题之二:顺序执行模式

上文已讲述了回溯法以及01背包问题的原理,本文讲述如何顺序执行解决01背包问题以及通过模板模式重构软件. 一.顺序执行流程图 图1无剪枝函数的01背包问题顺序执行算法流程图 图2 有剪枝函数的01背包问题顺序执行算法流程图 无剪枝函数是通用的深度遍历算法,为了减少搜索深度可通过剪枝函数处理完全不可能的分枝.与递归方案的区别主要表现在i>=n后需要"回溯",即用后进先出的方式将物品逐个拿出. 二.执行代码 递归与顺序执行方法仅仅是实现方法Backtracking(int i)不同,

如何按顺序执行两个动画

问题: 假如:需要按顺序执行两个动画A.B,B动画需要在A动画执行完毕后再执行.两个动画的执行不能有时间间隔,即A动画执行完毕立即执行B动画. 实现方案: 事先已经导入了Facebook的pop框架,并#import <POP.h> 1.设置A动画的动画时间,执行A动画 2.创建NSTimer定时器timer,设置时间间隔为A动画的动画时间.并把timer添加到主运行循环. 3.把B动画添加到timer调用的的selector方法中. - (void)touchesBegan:(NSSet *

autofac 一个接口多个实现的顺序执行

接口: namespace AutofacTest.Interface { public interface IUserInfo { string GetUserINfo(int uid); int sort(); } } 接口的实现: public class CrmUserInfoHelper : IUserInfo { public string GetUserINfo(int uid) { return "crmuserinfo"; } public int sort() {

试解释下列名词:程序的顺序执行,程序的并发执行。

一个计算由若干个操作组成,若这些操作必须按照某种先后次序来执行,以保证操作的结果是正确的,则这类计算过程称为程序的顺序执行过程. 所谓的程序的并发执行是指若干个程序同时在系统中运行,这些程序的执行在时间上是重叠的,一个程序的执行尚未结束,另一个程序的执行已经开始. 补充: 顺序程序的特点: 顺序性.封闭性.可再现性. 并发程序的特点: 失去程序的封闭性.程序与计算不再一一对应.程序并发执行时的相互制约关系.