javascript - Yeoman 生成器完成后同步执行命令行操作

标签 javascript node.js yeoman

我正在构建一个 Yeoman 生成器,完成后我想执行一些命令行操作,例如“npm install”、“bower install”和“grunt less”。我为此使用spawnCommand,并使用事件监听器嵌套所有操作以同步执行它们。然而,为了避免这种无休止的嵌套,我正在寻找一种更干净的实现,以使其易于扩展。 完美地,我想要一个包含命令的数组(例如 ['npm install'、'grunt install'、'less:dev']),并通过正确的错误检测同步处理它。

// Install npm packages
this.spawnCommand('npm', ['install'])
    .on('exit', function (err) {
        if (err) {
            this.log.error('npm package installation failed. Please run \'npm install\' and \'bower install\'. Error: ' + err);
        } else {
            // Install bower packages
            this.spawnCommand('bower', ['install'])
                .on('exit', function (err) {
                    if (err) {
                        this.log.error('bower package installation failed. Please run \'bower install\'. Error: ' + err);
                    } else {
                        this.spawnCommand('grunt', ['less'])
                            .on('exit', function (err) {
                                if (err) {
                                    this.log.error('Less compilation failed. Please run \'grunt less:dev\'. Error: ' + err);
                                } else {

                                }

                            }.bind(this));
                    }

                }.bind(this));
        }

    }.bind(this));

最佳答案

有这样的事吗? (虽然未经测试):

this.processTask = function (task) {
    this.spawnCommand(task.cmd, task.args)
        .on('exit', function (err) {
            if (err) {
                this.log.error('task failed. Error: ' + err);
            } else {
                this.emit('nextTask');
            }
        });
};

this.on('nextTask' function(){
    var next = this.tasks.shift();
    if (next){
       this.processTask(next);
    } else {
       console.log('we are done');
    }
}.bind(this));

//preparing the list of tasks:
this.tasks = [];
this.tasks.push({cmd: 'npm', args:['install']});
this.tasks.push({cmd: 'bower', args:['install']});
this.tasks.push({cmd: 'grunt', args:['less']});

//start first task

this.processTask(this.tasks.shift());

关于javascript - Yeoman 生成器完成后同步执行命令行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24550828/

相关文章:

javascript - Vuejs : Vue. 组件似乎不起作用

javascript - 捕获 Node.js 中的错误

javascript - 为什么 Node.js htmlparser2 在解析文档时插入额外的 Node ?

gruntjs - 发电机角度 : task "karma" not found when calling `grunt test`

html - 咕噜服务 :dist using local file paths

javascript - jQuery 验证 : validate form without throwing errors about empty fields

javascript - 为什么我的变量仍然未定义?

node.js - react 代理错误 : Could not proxy request/api/from localhost:3000 to http://localhost:8000 (ECONNREFUSED)

node.js - Windows 64 位中的 Testaulous 无法启动浏览器

Javascript 将数组中的嵌套对象转换为数组