运行 gulp 作为交互式提示

Run gulp as interactive prompt

运行ning Gulp 任务花费的大量时间落在这样的事情上:

这可以优化,如果不是 运行每次 gulp task_name 我们将 运行 将加载 gulpfile.js 的东西并在我们可以 [=36] 的地方启动提示=] gulp 任务通过输入它的名字。这将允许只花时间加载 gulp 任务一次,并且导入的节点模块将由 require 缓存并在后续任务执行时加载得更快。

如何实施?

这是我与社区分享我的知识的自我回答问题。
欢迎提供其他答案。将采纳最佳答案。

更新:

我发布了 npm 包 gulp-interactive

只需安装:

npm install --save-dev gulp-interactive

并在gulpfile.js中使用它:

require('gulp-interactive')();

然后在 shell:

$ gulp prompt

原始答案:

我实施了特殊的 gulp 任务 prompt。 首先安装 inquirer:

npm install --save-dev inquirer

这是一个有用的包,可以让我们要求开发人员输入任务名称。

接下来执行任务:

gulp.task('prompt', function (cb) {
    var promptedTask;

    function startPrompt() {
        promptedTask = undefined;
        gulp.start('prompt');
    }

    function onTaskEnd(event) {
        setTimeout(function () {
            if (event && promptedTask && event.task === promptedTask) {
                gulp.removeListener('task_stop', onTaskEnd);
                gulp.removeListener('task_err', onTaskEnd);
                gulp.removeListener('task_not_found', onTaskEnd);
                startPrompt();
            }
        });
    }

    gulp.on('task_stop', onTaskEnd);
    gulp.on('task_err', onTaskEnd);
    // replace gulp default listener for 'task_not_found' because it calls process.exit(1)
    gulp.removeAllListeners('task_not_found');
    gulp.on('task_not_found', function (err) {
        console.log('Task \'' + err.task + '\' is not in your gulpfile');
        onTaskEnd(err);
    });

    var inquirer = require('inquirer');
    inquirer.prompt([{ type: 'input', name: 'task', 'message': 'Enter gulp task name:' }])
        .then(function (answers) {
            promptedTask = answers.task || 'prompt';
            cb();
            gulp.start(promptedTask);
        });
});

现在您可以通过执行 gulp prompt 来启动提示符。 使用此优化将我的 Web 应用程序在 Docker for Mac 容器中的构建时间从 50 秒减少到 15 秒(我相信这是因为文件系统操作缓慢)。当 运行 直接在我的 Mac 上构建时,构建时间从 13 秒减少到 6 秒。