Как мне структурировать службу командной строки ruby gem?
Я пишу гем ruby, который пользователи могут установить и использовать инструмент командной строки ruby для взаимодействия со службой. Вы можете запускать и останавливать службу (она порождает дочерний процесс).
Я провел много исследований лучших способов написания сетевых сервисов, таких как ØMQ/EventMachine, и узнал, как создать гем Ruby, который установит бинарный файл, который вы можете использовать в командной строке, но я ' Я изо всех сил пытаюсь установить хорошую структуру кода.
Моя утилита командной строки будет принимать различные аргументы (я буду использовать Trollop), и она будет использовать различные классы для выполнения задач, а также использовать различные другие рубиновые гемы.
Я не уверен, куда я должен поместить свои файлы классов, и как требовать их в моем двоичном файле, чтобы пути были правильными.
3 ответа
В основном, 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
, но это считается плохой формой.
Если вы используете упаковщик, проще всего запустить приложение локально с bundle exec
например, bundle exec bin/myapp
, Вы можете поочередно использовать RUBYLIB
переменная окружения, например RUBYLIB=lib bin/myapp
, который поставит lib
в пути загрузки.
Вы можете создать структуру проекта с помощью Bundler.
Кратко:
Установить Bundler
$ gem install bundler
Используйте Bundler для создания проекта gem
$ 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
также установил бы вас с некоторой базовой структурой организационно говоря.