Как я должен структурировать свой сервис командной строки ruby gem?

StackOverflow https://stackoverflow.com//questions/9641056

Вопрос

Я пишу 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
.

Используйте 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, также установит вам некоторые основные структуры, являющиеся организационной головкой.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top