Cómo escribir tu primer CLI con Thor

En Magnetis estamos trasladando nuestra infraestructura de nube a Kubernetes. Para hacerlo, comencé a crear un montón de scripts de shell dentro de nuestra aplicación. No hay ningún problema con él, pero tan pronto como obtuve 5 archivos de script de shell diferentes, comenzó a complicarse.

En una de las sesiones de programación en pareja que realizamos en nuestro proceso de contratación, un candidato eligió a Thor para escribir el proyecto de prueba. Fue organizado y parecía fácil comenzar. Entonces, al conectar los puntos, pensé que nuestros guiones probablemente serían mucho más expresivos con Thor.

Las líneas de comando ya son parte de nuestra vida cotidiana: git, bundler y rails, por nombrar algunos. Crear uno te ayuda a organizar y compartir mejor las utilidades para el trabajo diario.

En este artículo escribiremos un ejemplo simple inspirado en una de las mejores escenas de Breaking Bad. Pero, aparte de su simplicidad, es el mismo proceso para crear una CLI para todo lo que desee.

Creando una nueva gema

Comencemos creando una nueva gema, que facilitará la distribución de nuestro software, en este caso el archivo ejecutable.

Para crear una nueva gema, bundler tiene un comando útil (el mismo bundler está diseñado con Thor):

$ bundle gem --exe walter

Esto generará un esqueleto de la siguiente manera:

 crear walter / Gemfile
 crear walter / lib / walter.rb
 crear walter / lib / walter / version.rb
 crear walter / walter.gemspec
 crear walter / Rakefile
 crear walter / README.md
 crear walter / bin / console
 crear walter / bin / setup
 crear walter / .gitignore
 crear walter / .travis.yml
 crear walter / .rspec
 crear walter / spec / spec_helper.rb
 crear walter / spec / walter_spec.rb
 crear walter / LICENSE.txt
 crear walter / exe / walter

Ahora necesitamos agregar Thor como una dependencia a nuestro proyecto, abrir walter.gemspec y agregar:

spec.add_dependency "thor", "~> 0.20"

También necesitaremos eliminar los elementos TODO en el archivo gemspec, así que continúe y edite los valores para el resumen, la descripción y la página de inicio. Ejecute el comando de instalación de paquete y todo está configurado para escribir algunas líneas de Thor.

Entra Thor

Abra lib / walter.rb y agreguemos algo de código, lo primero que necesita y hereda de Thor.

requiere 'walter'
requieren 'thor'
módulo Walter
 clase CLI 

Ahora, agreguemos un simple hola mundo

clase CLI 

Vamos, hola mundo en 2017? ¡Hagámoslo Hola Heisenberg!

clase CLI 

Ya casi llegamos, lo último es llamar a nuestra biblioteca desde el archivo binario.

El binario

La directiva exe que utilizamos para crear la gema, generó un binario walter en nuestro proyecto. Lo primero que debe hacer es cambiar los permisos para que podamos ejecutar el archivo:

chmod + x exe / walter

Ahora podemos llamarlo:

$ paquete exec exe / walter

Esto no dará salida, pero no se preocupe. Esto se espera. Abra exe / walter en su editor favorito y agreguemos esto:

Walter :: CLI.start (ARGV)

Estamos llamando a la CLI que acabamos de crear y pasando los argumentos recibidos. Ahora vamos a llamarlo de nuevo:

$ paquete exec exe / walter
  walter hello [nombre] # saluda
  walter help [COMANDO] # Describe los comandos disponibles o un comando específico

Thor enumera todos los comandos que tiene disponible esta CLI, muy dulce.

Si intentas llamar a nuestro comando de saludo sin el nombre:

$ paquete exec exe / walter hello
ERROR: se llamó a "walter hello" sin argumentos
Uso: "walter hello [nombre]"

Sí, nos dice cómo usarlo. Hacer esto en el script de shell requeriría algunos condicionales, pero Thor tiene esto incorporado.

$ paquete exec exe / walter hello Heisenberg
eres un hombre bueno, verdad.

Instalar y publicar

Para instalar la gema en su sistema, de esta manera puede hacerlo desde cualquier lugar:

$ rake install

Llámalo:

$ walter hola Jesse
di mi nombre

Si quieres liberarlo a rubygems, solo ejecuta

lanzamiento de $ rake

El ecosistema de Ruby es hermoso, ¿no?

Conclusión

Thor hace que los guiones diarios sean mucho más expresivos y significativos. Es una buena adición a un equipo que ya usa Ruby como idioma oficial, ya que todos los miembros del equipo pueden contribuir a mejorar sus comandos.

En nuestro caso, se utilizó para crear comandos para abrir clústeres de kubernetes y para implementar nuestra aplicación para el entorno de preparación. ¡Puede usar para automatizar algunos procesos internos o flujos de trabajo que tiene en su empresa!

Para terminar esto, algunos consejos finales:

  • Siempre que sea posible, intente utilizar métodos de comando que sean comunes a otras CLI: init, estado, nuevo, crear, actualizar.
  • intente exponer como CLI la menor cantidad de métodos posibles, para poder encapsular cosas que solo son necesarias dentro del código.
  • si necesita escribir algún archivo de configuración, use $ HOME /.

Si quieres profundizar en el tema, aquí están los documentos oficiales.

Happy Thor!