tristes - ¿Cómo abortar con gracia el generador de yeoman en error?
videos de abortos provocados (1)
Estoy escribiendo un generador de yeoman y quiero verificar algunos requisitos previos, por ejemplo, un git
está instalando. Puedo verificar esto fácilmente usando .exec
, pero ¿cómo abortar con gracia el generador y reportar un error al usuario? Busqué en docs, pero parece que me falta alguna forma obvia de hacerlo. ¿Alguna pista?
Lanzar excepción, por supuesto, abortará el generador, pero ¿es una mejor manera? Tal vez algo más fácil de usar? No todos los usuarios de yeoman pueden leer las excepciones de js.
El estado actual del manejo de errores en los generadores populares es bastante diverso:
en la mayoría de los casos, simplemente registran el error y regresan de la acción y dejan que las acciones de subsequnt se ejecuten y devuelven el código de estado 0:
Método
setupTravis
generator-karma :if (err) { this.log.error(''Could not open package.json for reading.'', err); done(); return;
}
o establezca una propiedad de cancelación personalizada en caso de error y omita otras acciones con la verificación de la propiedad de cancelación, pero aún así devuelva el código de estado 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)); };
o terminar manualmente el proceso con
process.exit
:Método de
configuring
generator-mobile :if (err) { self.log.error(err); process.exit(1); }
Sin embargo, ninguno de estos métodos proporciona una buena manera de indicar al entorno que algo salió mal, excepto el último, pero que llama directamente a process.exit
es un olor a diseño.
Lanzar una excepción también es una opción, pero esto también presenta el stackstrace para el usuario, lo que no siempre es una buena idea.
La mejor opción sería usar el método Environment.error , que tiene algunas ventajas interesantes:
- El
Environment
se expone en la propiedadenv
deyeoman.generators.Base
- se emite un evento de
error
que se maneja con el código yo cli - la ejecución dará como resultado un código de estado distinto de cero (error) que puede anularse
- Por defecto, solo se mostrará el mensaje y no habrá seguimiento de pila.
- el stacktrace se puede mostrar opcionalmente proporcionando la
--debug
incorporada--debug
cuando se vuelve a ejecutar el generador.
Con el uso de esta técnica, tu método de acción se vería así:
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'');
}
});