如何优雅地中止yeoman发生器出错?

时间:2014-12-23 08:31:43

标签: yeoman

我正在编写一个yeoman生成器并希望检查一些先决条件,例如正在安装git。我可以使用.exec轻松检查这一点,但我如何优雅地中止生成器并向用户报告错误?我搜索了文档,但似乎我错过了一些明显的方法。任何提示?

抛出异常当然会中止生成器,但这是最好的方法吗?也许更方便用户的东西?并非所有yeoman用户都能读取js例外。

1 个答案:

答案 0 :(得分:42)

流行的生成器中当前的错误处理状态非常多样化:

  • 在大多数情况下,他们只记录错误并从操作中返回并让子流程操作运行并返回0状态代码:

    generator-karmasetupTravis方法:

    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-mobileconfiguring方法:

    if (err) {
          self.log.error(err);
          process.exit(1);
    }
    

然而,这些方法都没有提供向环境发出信号的好方法,除了最后一个问题,但是直接调用process.exit是一种设计气味。

抛出异常也是一种选择,但这也为用户提供了stackstrace,这并不总是一个好主意。

最好的选择是使用Environment.error方法,它有一些很好的优点:

  • Environment通过env
  • yeoman.generators.Base属性公开
  • 发出error事件,由yo cli代码
  • 处理
  • 执行将导致非零(错误)状态代码,可以覆盖
  • 默认情况下,yo仅显示消息而不显示stacktrace
  • 可以选择显示堆栈跟踪,并在重新运行生成器时提供--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');
  }
});