Подтвердить что ты не робот

Как изящно прервать генератор Yeoman по ошибке?

Я пишу генератор йома и хочу проверить некоторые предварительные условия, например, установить git. Я могу легко проверить это с помощью .exec, но как изящно прервать генератор и сообщить об ошибке пользователю? Я искал документы, но, похоже, я пропустил какой-то очевидный способ сделать это. Любые подсказки?

Исключение броска, конечно же, прерывает генератор, но лучший ли он? Может быть, что-то более удобное для пользователя? Не все пользователи йома могут читать исключения js.

4b9b3361

Ответ 1

Текущее состояние обработки ошибок в популярных генераторах весьма разнообразно:

  • в большинстве случаев они просто регистрируют ошибку и возвращаются из действия и позволяют выполнять действия подсетей и возвращать код состояния 0:

    generator-karma setupTravis метод:

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

    }

  • или установите собственное свойство abort при ошибке и пропустите дальнейшие действия с помощью cheking в свойстве abort, но все же верните код состояния 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\ 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 является дизайнерским запахом.

Выбрасывание исключения также является опцией, но это также представляет стекестрах для пользователя, что не всегда является хорошей идеей.

Лучшим вариантом будет использование метода Environment.error, который имеет ряд приятных преимуществ:

  • Environment полностью раскрывает свойство env yeoman.generators.Base
  • Событие error испускается, которое обрабатывается кодом yo cli
  • выполнение приведет к ненужному (ошибочному) коду состояния, который является переопределяемым
  • По умолчанию yo будет отображать только сообщение и нет stacktrace
  • при повторном запуске генератора может быть отображена опция 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');
  }
});