我正在构建一个 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/