Как я должен структурировать свой сервис командной строки ruby gem?
-
10-12-2019 - |
Вопрос
Я пишу ruby gem, который пользователи могут установить и использовать ruby-инструмент командной строки для взаимодействия со службой.Вы можете запускать и останавливать службу (она будет порождена дочерним процессом).
Я провел много исследований о том, что лучше всего использовать для написания сетевого сервиса, такого как ØMQ / EventMachine, и я понял, как создать Ruby gem, который установит двоичный файл, который вы можете использовать в командной строке, но я изо всех сил пытаюсь создать хорошую структуру кода.
Моя утилита командной строки будет принимать различные аргументы (я буду использовать Шлюха) и он будет использовать различные классы для выполнения каких-либо действий, а также использовать различные другие драгоценные камни ruby.
Я не уверен, куда мне следует поместить файлы моих классов и как запросить их в моем двоичном файле, чтобы пути были правильными.
Решение
В основном RubyGems позаботится об этом за вас.Вам нужно будет включить ваш исполняемый файл в files
составьте список и поместите его в executables
в вашем gemspec.Обычно ваш исполняемый файл помещается в bin
в вашем каталоге, например:
$ ls
bin/ myapp.gemspec lib/ Rakefile
$ ls bin
bin/myapp
Тогда ваш gemspec будет выглядеть следующим образом:
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
На этом этапе, когда пользователи устанавливают ваше приложение через RubyGems, myapp
будет стоять на их пути, и lib
будет находиться в пути загрузки вашего приложения, поэтому ваш исполняемый файл может просто начинаться с:
#!/usr/bin/env ruby
require 'myapp'
# whatever other requires
Единственная проблема с этим заключается в том, что во время разработки вы не можете просто сделать bin/myapp
и запустите свое приложение.Некоторые разработчики манипулируют путем загрузки с помощью $:
или $LOAD_PATH
, но это считается дурным тоном.
Если вы используете bundler, проще всего просто запустить ваше приложение локально с помощью bundle exec
, например bundle exec bin/myapp
.Вы можете поочередно использовать RUBYLIB
переменная среды, например RUBYLIB=lib bin/myapp
, который поставит lib
в пути загрузки.
Другие советы
Вы можете генерировать структуру проекта GEM с Bundler .
Кратко:
<Сильные> Установите Bundler
$ gem install bundler
.
.
$ bundle gem myapp
$ cd myapp
.
$ mkdir bin
$ cat > bin/mycommand << EOSCRIPT
#!/usr/bin/env ruby
require 'myapp'
puts "Executing myapp"
EOSCRIPT
$ chmod +x bin/mycommand
<Сильная> Установите драгоценный камень
$ rake install
.
Запустите скрипт
.
$ mycommand
Executing mycommand
Поделиться своей утилитой на rubygems.org
.
$ rake release
Больше документов на Сайт
Поскольку все драгоценные камни являются открытым исходным кодом по природе, вы всегда можете взглянуть на некоторые из лучших для примеров.Использование GEM Builder, таких как jeweler
или hoe
, также установит вам некоторые основные структуры, являющиеся организационной головкой.