[记录]使用 Gulp 时删除目录的一个小坑

在使用 Gulp 编译 Node 代码的时候,我想在编译之前删除原始的 build 目录,配置项如下:

const gulp = require("gulp");
const del = require("del");
const babel = require("gulp-babel");
const liveReload = require("gulp-livereload");
const env = process.env.NODE_ENV
const isDevelopment = (env === "dev");

// build 文件夹清理
gulp.task("clean",()=>{
    del(["build/"])
})

// 复制 Views 文件夹
gulp.task("copyViews",()=>{
    gulp.src("src/nodebff/views/**/*")
        .pipe(gulp.dest("build/views"))
})

// 编译
gulp.task("compile",["clean"],()=>{
    gulp.src("src/nodebff/**/*.js")
    .pipe(babel({
        babelrc:false,
        plugins:[
            "babel-plugin-transform-es2015-modules-commonjs"
        ]
    }))
    .pipe(gulp.dest("build/"))
    .pipe(liveReload());
})

// 开发环境构建
gulp.task("build:dev",["compile","copyViews"]);

// 生产环境构建
gulp.task("build:prod",["compile","copyViews"]);

// 自动监控
gulp.task("autoWatch",()=>{
    liveReload.listen();
    gulp.watch("src/nodebff/**/*.js",["build:dev"])
});

gulp.task("default",[isDevelopment ? "autoWatch" : "build:prod"]);

主要定义了针对开发环境的 build:dev 任务和针对生产环境的 build:prod 任务,以及自动监控的任务 autoWatch,同时还有几个细分任务:清理文件夹的 clean 任务、负责复制 Views 文件夹的 copyViews 任务以及负责编译 JS 文件的 compile 任务。
在执行 compile 任务之前需要先执行 clean 任务清理文件夹,以避免代码污染。
看起来没什么问题,在真正运行时出现了这么一种情况:

编译node.gif

如上,build 文件夹一会出现一会消失,让人苦恼,如果同时还是用了 supervisor 这样的自启工具,还会频繁的崩溃。
在我的配置中,compile 任务和 copyViews 任务是在 clean 任务之后执行的,然后才将文件编译后放到新建的 build 文件夹下,执行顺序上应该没有问题。我猜测问题可能出现在 clean 这个任务上,我在 clean 任务中使用了 del 包删除 build 文件,删除的过程可能是异步的,也就是可能在真正执行删除时 compile 任务和 copyViews 任务已经执行过了?
我的解决方案是使用万能的 setTimeout 神器,只需对原始代码做一点修改:

const gulp = require("gulp");
const del = require("del");
const babel = require("gulp-babel");
const liveReload = require("gulp-livereload");
const env = process.env.NODE_ENV
const isDevelopment = (env === "dev");

// build 文件夹清理
gulp.task("clean",()=>{
    del(["build/"])
})

// 复制 Views 文件夹
gulp.task("copyViews",()=>{
    setTimeout(()=>{
        gulp.src("src/nodebff/views/**/*")
            .pipe(gulp.dest("build/views"))
    },100)
})

// 编译
gulp.task("compile",["clean"],()=>{
    setTimeout(()=>{
        gulp.src("src/nodebff/**/*.js")
        .pipe(babel({
            babelrc:false,
            plugins:[
                "babel-plugin-transform-es2015-modules-commonjs"
            ]
        }))
        .pipe(gulp.dest("build/"))
        .pipe(liveReload());
    },100)
})

// 开发环境构建
gulp.task("build:dev",["compile","copyViews"]);

// 生产环境构建
gulp.task("build:prod",["compile","copyViews"]);

// 自动监控
gulp.task("autoWatch",()=>{
    liveReload.listen();
    gulp.watch("src/nodebff/**/*.js",["build:dev"])
});

gulp.task("default",[isDevelopment ? "autoWatch" : "build:prod"]);

之后的效果如下:

编译node.gif

注:如果保存的频率过快的话,还是会出现上面那种情况,这时可以将 setTimeout 的延迟时间改大一些。

完。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容