Domanda Come abortire con grazia il generatore di yeoman in caso di errore?


Sto scrivendo un generatore di yeoman e voglio verificare alcuni prerequisiti, ad esempio a git essere installato. Posso facilmente controllare questo usando .exec, ma come faccio ad abortire con garbo il generatore e segnalare un errore all'utente? Ho cercato documenti, ma sembra che mi manchi un modo ovvio per farlo. Qualche suggerimento?

L'eccezione di lancio ovviamente interromperà il generatore, ma è un modo migliore? Forse qualcosa di più user friendly? Non tutti gli utenti yeoman sono in grado di leggere le eccezioni js.


18
2017-12-23 08:31


origine


risposte:


Lo stato attuale della gestione degli errori nei generatori popolari è piuttosto vario:

  • nella maggior parte dei casi registrano l'errore e ritornano dall'azione e lasciano eseguire le azioni secondarie e restituiscono il codice di stato 0:

    Generatore di karma'S setupTravis metodo:

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

    }

  • o impostare un costume abort proprietà in caso di errore e saltare ulteriori azioni con cheking sul abort proprietà ma restituisce ancora il codice di stato 0:

    Generator-jhipster di 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));
    };
    
  • o terminare manualmente il processo con process.exit:

    generatore-mobile'S configuringmetodo:

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

Tuttavia nessuno di questi metodi fornisce un buon modo per segnalare all'ambiente che qualcosa è andato storto tranne l'ultimo, ma che chiama direttamente process.exit è un odore di design.

Anche lanciare un'eccezione è un'opzione ma questa presenta anche lo stackstrace all'utente che non è sempre una buona idea.

L'opzione migliore sarebbe utilizzare il Environment.error metodo, che ha alcuni vantaggi:

  • il Environment è esposto approfonditamente env proprietà del yeoman.generators.Base
  • un error viene emesso un evento gestito dal codice cli yo
  • l'esecuzione risulterà in un codice di stato diverso da zero (errore) che è sovrascrivibile
  • di default yo visualizzerà solo il messaggio e nessun stacktrace
  • lo stacktrace può essere opzionalmente visualizzato fornendo il --debug opzione integrata durante il riavvio del generatore.

Con l'utilizzo di questa tecnica il tuo metodo di azione sarebbe simile a questo:

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');
  }
});

40
2017-12-25 15:08