【问题标题】:only last callback is being called in gulp file在 gulp 文件中只调用最后一个回调
【发布时间】:2019-11-06 07:46:54
【问题描述】:

在 gulpfile 中,我有 3 个任务,当我运行以下代码时,它只执行最后一个任务的回调。我希望如果我运行gulp 命令,在完成 clean 任务后,它应该执行 copy:db & default 任务的回调.

Gulp.task('clean', function () {
    console.log('Clean');
    return Gulp.src("./dbSchema/*")
        .pipe(VinylPaths(Del));
})

Gulp.task('copy:db', Gulp.series("clean"), function () {
    console.log('Copy DB');
    return Gulp.src("./db/*")
        .pipe(Gulp.dest("./dbSchema"));
})

Gulp.task('default', Gulp.series("copy:db"), function () {
    console.log('defaulp');
    return TypeScriptProject.src()
        .pipe(TypeScriptProject())
        .js.pipe(Gulp.dest('dist'));
});

当我运行命令gulp 时,它会显示以下日志。

[12:46:37] Starting 'default'...
[12:46:37] Starting 'copy:db'...
[12:46:37] Starting 'clean'...
Clean
[12:46:37] Finished 'clean' after 26 ms
[12:46:37] Finished 'copy:db' after 28 ms
[12:46:37] Finished 'default' after 31 ms

谁能告诉我哪里出错了?

【问题讨论】:

    标签: gulp gulp-typescript


    【解决方案1】:

    要让您的代码按照您描述的方式运行,需要将回调函数作为参数传递给.series()。例如:

    Gulp.task('clean', function () {
        console.log('Clean');
        return Gulp.src("./dbSchema/*")
            .pipe(VinylPaths(Del));
    })
    
    Gulp.task('copy:db', Gulp.series(clean, function () {
        console.log('Copy DB');
        return Gulp.src("./db/*")
            .pipe(Gulp.dest("./dbSchema"));
    }))
    
    Gulp.task('default', Gulp.series(copy:db, function () {
        console.log('defaulp');
        return TypeScriptProject.src()
            .pipe(TypeScriptProject())
            .js.pipe(Gulp.dest('dist'));
    }));
    

    恕我直言,拥有三个完全独立的任务会更简单:

    Gulp.task('clean', function () {
        console.log('Clean');
        return Gulp.src("./dbSchema/*")
            .pipe(VinylPaths(Del));
    });
    
    Gulp.task('copy:db', function () {
        console.log('Copy DB');
        return Gulp.src("./db/*")
            .pipe(Gulp.dest("./dbSchema"));
    });
    
    Gulp.task('default', function () {
        console.log('defaulp');
        return TypeScriptProject.src()
            .pipe(TypeScriptProject())
            .js.pipe(Gulp.dest('dist'));
    });
    

    然后调用它们:

    Gulp.task('default', gulp.series(clean, copy:db, js));
    

    Gulp.task('default', gulp.series(clean, gulp.parallel(copy:db, js)));
    

    希望有帮助:)


    补充说明:

    1. gulp/vars 的命名约定通常是驼峰式,例如:gulptypeScriptProject 而不是 GulpTypeScriptProject

    2. 您可以通过使用:var {gulp, task, src, dest, watch, series, parallel} = require('gulp');

    3. 完全消除编写 gulp. 的需要
    4. 您可以使用 CommonJS exports 模块符号来声明任务,而不是直接定义您的任务,从而使您的代码更易于阅读。

    5. 如果您在使用引号时保持一致,而不是混合单打和双打,那么生活会更轻松一些。两者都允许通配符


    按照 Gulp 自己的文档可能是开始的地方,their sample code on github 有一些很好的例子来设置基本的 gulpfile。

    如果你把这一切都总结起来,你会得到这个:

    /*
     * Example of requires with gulp methods also requiring gulp.
     */
    var { 
        gulp,
        dest,
        series,
        parallel,
        src,
        task,
        watch 
    }           = require('gulp'),
    vinylPaths  = require('vinyl-paths'), // may not be required, see note in clean func.
    del         = require('del'),
    ts          = require('gulp-typescript');
    
    /*
     * Added a basic TypeScript Project so the example is complete and could run.
     */
    var typeScriptProject = ts.createProject({
        declaration: true
    });
    
    /*
     * Your tasks converted to plain/standard js functions.
     */
    function clean () {
        return src('dbSchema/*')
            .pipe(vinylPaths(del));
    
        // Looking at your example code the vinylPaths is redundant,
        // as long as you’re using del ^2.0 it will return its promise,
        // so you could replace the above with:
        return del([ 'dbSchema' ]);
    }
    
    function copyDb () {
        return src('db/*')
            .pipe(dest('dbSchema'));
    }
    
    function scripts () {
        // example src path
        return src('lib/*.ts')
            .pipe(typeScriptProject())
            .pipe(dest('dist'));
    }
    
    /*
     * By defining all the tasks separately it makes it really clear how the tasks will run.
     */
    var build = gulp.series (
        clean, 
        gulp.parallel (
            copyDb,
            scripts
        )
    );
    
    /*
     * Example of using `exports` module notation to declare tasks.
     */
    exports.clean = clean;
    exports.copyDb = copyDb;
    exports.scripts = scripts;
    exports.build = build;
    
    /*
     * Good practise to define the default task as a reference to another task.
     */
    exports.default = build;
    

    【讨论】:

    • 我想这会起作用,但下面链接中的示例以我在示例中使用它的方式使用它。能否请您验证。 typescriptlang.org/docs/handbook/gulp.html#watchify
    • 在您下面的示例中,他们解释说 bundle 函数需要由 default gulp 任务和 watchify 调用(每次发生代码更改时),因此需要额外的复杂性,但您的代码并非如此。我将为您更新我的答案,并提供一些您可能会觉得有用的示例链接
    猜你喜欢
    • 2010-12-18
    • 1970-01-01
    • 2011-01-26
    • 2023-01-15
    • 2012-08-02
    • 1970-01-01
    • 2020-10-26
    • 2013-04-28
    • 1970-01-01
    相关资源
    最近更新 更多