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

gri*_*yvp 20 yeoman

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

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

nem*_*esv 42

流行的生成器中的错误处理的当前状态是多种多样的:

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

    generator-karmasetupTravis方法:

    if (err) {
        this.log.error('Could not open package.json for reading.', err);
        done();
        return;
    
    Run Code Online (Sandbox Code Playgroud)

    }

  • 或者abort在出错时设置自定义属性并跳过对该abort属性进行cheking的进一步操作,但仍返回0状态代码:

    generator-jhipster的 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));
    };
    
    Run Code Online (Sandbox Code Playgroud)
  • 或者手动结束流程process.exit:

    发电机的移动configuring方法:

    if (err) {
          self.log.error(err);
          process.exit(1);
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

  • Environment暴露的彻底env的财产yeoman.generators.Base
  • error发出一个由yo cli代码处理的事件
  • 执行将导致非零(错误)状态代码,可以覆盖
  • 默认情况下,yo将仅显示消息而不显示堆栈跟踪
  • 可以选择显示堆栈跟踪,并--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');
  }
});
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的惊人答案! (4认同)