我正在编写一个yeoman生成器并希望检查一些先决条件,例如正在安装git
。我可以使用.exec
轻松检查这一点,但我如何优雅地中止生成器并向用户报告错误?我搜索了文档,但似乎我错过了一些明显的方法。任何提示?
抛出异常当然会中止生成器,但这是最好的方法吗?也许更方便用户的东西?并非所有yeoman用户都能读取js例外。
答案 0 :(得分:42)
在大多数情况下,他们只记录错误并从操作中返回并让子流程操作运行并返回0状态代码:
generator-karma的setupTravis
方法:
if (err) {
this.log.error('Could not open package.json for reading.', err);
done();
return;
}
或者在出错时设置自定义abort
属性并跳过abort
属性上的cheking的进一步操作,但仍然返回0状态代码:
generator-jhipster's CloudFoundryGenerator:
CloudFoundryGenerator.prototype.checkInstallation = function checkInstallation() {
if(this.abort) return;
var done = this.async();
exec('cf --version', function (err) {
if (err) {
this.log.error('cloudfoundry\'s cf command line interface is not available. ' +
'You can install it via https://github.com/cloudfoundry/cli/releases');
this.abort = true;
}
done();
}.bind(this));
};
或使用process.exit
手动结束流程:
generator-mobile的configuring
方法:
if (err) {
self.log.error(err);
process.exit(1);
}
然而,这些方法都没有提供向环境发出信号的好方法,除了最后一个问题,但是直接调用process.exit
是一种设计气味。
抛出异常也是一种选择,但这也为用户提供了stackstrace,这并不总是一个好主意。
Environment
通过env
yeoman.generators.Base
属性公开
error
事件,由yo cli代码--debug
内置选项。使用此技术,您的操作方法如下所示:
module.exports = generators.Base.extend({
method1: function () {
console.log('method 1 just ran');
this.env.error("something bad is happened");
console.log('this won't be executed');
},
method2: function () {
console.log('this won't be executed');
}
});