Comment écrire votre première CLI avec Thor

Chez Magnetis, nous déplaçons notre infrastructure cloud vers Kubernetes. Pour ce faire, j'ai commencé à créer un tas de scripts shell dans notre application. Cela ne pose aucun problème, mais dès que j’ai reçu 5 fichiers de script shell différents, cela a commencé à s’agiter.

Lors de l'une des sessions de programmation par paire que nous organisons dans notre processus de recrutement, un candidat a choisi Thor pour rédiger le projet test. C'était organisé et semblait facile à démarrer. Alors reliant les points, je pensais que nos scripts seraient probablement beaucoup plus expressifs avec Thor.

Les lignes de commande font déjà partie de notre quotidien: git, bundler et rails, pour n'en nommer que quelques-uns. En créer un vous aide à organiser et à mieux partager les utilitaires pour le travail quotidien.

Dans cet article, nous allons écrire un exemple simple inspiré par l’une des meilleures scènes de Breaking Bad. Mais, mis à part sa simplicité, il est identique de créer une CLI pour tout ce que vous voulez.

Créer un nouveau joyau

Commençons par créer un nouveau joyau qui facilitera la distribution de notre logiciel, dans ce cas le fichier exécutable.

Pour créer une nouvelle gemme, bundler a une commande pratique (le bundler lui-même est conçu avec Thor):

$ bundle gem --exe walter

Cela va générer un squelette comme suit:

 créer walter / Gemfile
 créer walter / lib / walter.rb
 créer walter / lib / walter / version.rb
 créer walter / walter.gemspec
 créer walter / rakefile
 créer walter / README.md
 créer walter / bin / console
 créer walter / bin / setup
 créer walter / .gitignore
 créer walter / .travis.yml
 créer walter / .rspec
 créer walter / spec / spec_helper.rb
 créer walter / spec / walter_spec.rb
 créer walter / LICENSE.txt
 créer walter / exe / walter

Nous devons maintenant ajouter le Thor comme dépendance à notre projet, ouvrir walter.gemspec et ajouter:

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

Nous devrons également supprimer les éléments TODO du fichier gemspec. Continuez donc et éditez les valeurs pour le résumé, la description et la page d'accueil. Exécutez la commande bundle install et tout est configuré pour écrire des lignes Thor.

Entrez Thor

Ouvrez lib / walter.rb et ajoutons du code, la première chose que vous devez exiger et hériter de Thor.

besoin de 'walter'
besoin de 'thor'
module Walter
 classe CLI 

Ajoutons maintenant un simple monde de salut

classe CLI 

Allez, bonjour le monde en 2017? Faisons-en un bonjour Heisenberg!

classe CLI 

Nous sommes presque arrivés, la dernière chose à faire est d’appeler notre lib depuis le fichier binaire.

Le binaire

La directive exe que nous avons utilisée pour créer la gemme a généré un binaire de Walter dans notre projet. La première chose à faire est de modifier les autorisations afin que nous puissions exécuter le fichier:

chmod + x exe / walter

Maintenant, nous pouvons l'appeler:

$ bundle exec exe / walter

Cela ne donnera aucun résultat, mais ne vous inquiétez pas. Ceci est prévu. Ouvrez exe / walter dans votre éditeur préféré et ajoutons ceci:

Walter :: CLI.start (ARGV)

Nous appelons la CLI que nous venons de créer et transmettons les arguments reçus. Maintenant appelons à nouveau:

$ bundle exec exe / walter
  walter bonjour [nom] # dire bonjour
  walter help [COMMAND] # Décrire les commandes disponibles ou une commande spécifique

Thor liste toutes les commandes disponibles de cette CLI, donc adorable.

Si vous essayez d'appeler notre commande hello sans le nom:

$ bundle exec exe / walter hello
ERREUR: “walter hello” a été appelé sans argument
Usage: “bonjour walter [nom]”

Oui, ça nous dit comment l'utiliser. Faire cela en script shell nécessiterait quelques conditions, mais Thor a cela intégré.

$ bundle exec exe / walter bonjour Heisenberg
vous avez raison.

Installation et publication

Pour installer la gemme sur votre système, vous pouvez le télécharger n'importe où:

$ rake install

Appeler:

$ walter bonjour Jesse
Dis mon nom

Si vous voulez relâcher Rubygems, lancez simplement

$ rake release

L’écosystème Ruby est magnifique, n’est-ce pas?

Conclusion

Thor rend les scripts quotidiens beaucoup plus expressifs et significatifs. C'est un ajout intéressant à une équipe qui utilise déjà Ruby comme langue officielle, car tous les membres de l'équipe peuvent contribuer à rendre vos commandes encore meilleures.

Dans notre cas, il a été utilisé pour créer des commandes permettant de créer des clusters kubernetes et de déployer notre application pour l'environnement de transfert. Vous pouvez utiliser pour automatiser certains processus internes ou flux de travail de votre entreprise!

Pour finir, quelques conseils finaux:

  • Dans la mesure du possible, essayez d'utiliser des méthodes de commande communes à d'autres CLI: init, status, new, create, update.
  • essayez d'exposer en tant que CLI le moins de méthodes possible afin de pouvoir encapsuler des éléments qui ne sont nécessaires que dans le code.
  • si vous avez besoin d'écrire un fichier de configuration, utilisez $ HOME /.

Si vous voulez approfondir le sujet, voici la documentation officielle.

Heureux Thor!