Как мне структурировать службу командной строки 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 также установил бы вас с некоторой базовой структурой организационно говоря.

Другие вопросы по тегам