Comment dois-je structurer mon service de ligne de commande Ruby Gem ?
-
10-12-2019 - |
Question
J'écris un joyau Ruby que les utilisateurs peuvent installer et utiliser l'outil Ruby en ligne de commande pour interagir avec le service.Vous pouvez démarrer et arrêter le service (il générera un processus enfant).
J'ai fait beaucoup de recherches sur les meilleures choses à utiliser pour écrire un service réseau, tel que ØMQ/EventMachine et je comprends comment créer une gemme Ruby qui installera un binaire que vous pouvez utiliser dans la ligne de commande, mais je' J'ai du mal à établir une bonne structure de code.
Mon utilitaire de ligne de commande prendra divers arguments (j'utiliserai Catin) et il utilisera diverses classes pour faire des choses et utilisera diverses autres gemmes de rubis.
Je ne sais pas où placer mes fichiers de classe et comment les exiger dans mon binaire pour que les chemins soient corrects.
La solution
En grande partie, RubyGems s'en chargera pour vous.Vous devrez inclure votre exécutable dans le files
liste et mettez-la dans la executables
dans votre gemspec.Il est courant de placer votre exécutable dans bin
dans votre répertoire, par exemple :
$ ls
bin/ myapp.gemspec lib/ Rakefile
$ ls bin
bin/myapp
Votre gemspec ressemblerait alors à :
Gem::Specification.new do |s|
s.name = 'myapp'
# whatever else is in your gemspec
s.files = ["bin/myapp","lib/myapp.rb"] # or whatever other files you want
s.executables = ["bin/todo"]
end
À ce stade, lorsque les utilisateurs installent votre application via RubyGems, myapp
sera sur leur chemin, et lib
sera dans le chemin de chargement de votre application, votre exécutable peut donc simplement commencer par :
#!/usr/bin/env ruby
require 'myapp'
# whatever other requires
Le seul problème est que, pendant le développement, vous ne pouvez pas simplement faire bin/myapp
et faites fonctionner votre application.Certains développeurs manipulent le chemin de chargement via $:
ou $LOAD_PATH
, mais cela est considéré comme une mauvaise forme.
Si vous utilisez un bundler, il est plus simple d'exécuter votre application localement avec bundle exec
, par exemple. bundle exec bin/myapp
.Vous pouvez alternativement utiliser le RUBYLIB
variable d'environnement, par ex. RUBYLIB=lib bin/myapp
, ce qui mettra lib
dans le chemin de chargement.
Autres conseils
Vous pouvez générer une structure de projet GEM avec Bundler .
brièvement:
$ gem install bundler
$ bundle gem myapp
$ cd myapp
ajoutez un exécutable
$ mkdir bin
$ cat > bin/mycommand << EOSCRIPT
#!/usr/bin/env ruby
require 'myapp'
puts "Executing myapp"
EOSCRIPT
$ chmod +x bin/mycommand
Installez votre gemme
$ rake install
$ mycommand
Executing mycommand
Partagez votre utilitaire sur rubygems.org
$ rake release
Plus de documents sur Le site Web
Étant donné que toutes les pierres précieuses sont par nature open source, vous pouvez toujours consulter certaines des meilleures pour obtenir des exemples.Utiliser un générateur de gemmes comme jeweler
ou hoe
vous mettrait également en place avec une partie de la structure de base sur le plan organisationnel.