Как создать команду оболочки, поддерживающую Ruby? - PullRequest
2 голосов
/ 15 марта 2012

Я создаю драгоценный камень, в котором я хотел бы иметь возможность сделать команду оболочки, выполняющую функцию в драгоценном камне. В более простом контексте мне нужно создать сценарий оболочки, который выполняет функцию Ruby с параметрами при запуске команды оболочки. Какой самый простой способ сделать это?

Например:

$ cow moo

получит самоцвет коровы со скриптом для команды коровы и выполнит функцию 'moo' в самоцвете Ruby.

Если бы я мог, мне бы также хотелось, чтобы поддержка общего форматирования 'options' в оболочке:

$ cow -t moo

Какой из вышеприведенных примеров использует параметр и применяет сценарий на Ruby для его обработки (в этом примере -t дважды напечатает 'moo').

Если бы кто-нибудь мог помочь нам в этом, это было бы очень полезно. Спасибо!

Ответы [ 2 ]

5 голосов
/ 15 марта 2012

Вы можете создать обычный исполняемый Ruby-файл с именем cow, содержащий:

#!/usr/bin/env ruby
require 'cow'

Cow.say ARGV.first

Обратите внимание на первую строку, которая является строкой Шебанга .Он сообщает вашей оболочке, какую программу использовать для интерпретации сценария.Это позволяет пользователю просто вызывать cow вместо ruby $(which cow).

Поместить ваш скрипт в каталог bin:

cow/
  bin/
    cow  <- your executable file
  lib/
    cow.rb
    cow/
      say.rb
  cow.gemspec

Теперь все, что вам нужно сделать, это поставитьчто в спецификации вашего гема:

Gem::Specification.new 'cow' do |gem|
  gem.executables = %w(bin/cow)
end

Во время установки Rubygems установит двоичные файлы вашего гема где-нибудь на пути пользователя, гарантируя, что они будут найдены.включает optparse, но есть также много драгоценных камней .

Я создал мой собственный анализатор опций, называемый Acclaim , который я используюв моих собственных утилитах.Вот пример:

class Cow::Command < Acclaim::Command
  option :all_caps, '-A', '--all-caps'

  when_called do |options, args|
    text = args.first.to_s
    text.upcase! if options.all_caps?
    Cow.say text
  end
end

Для того, чтобы протестировать ваше приложение, вы можете просто выполнить свой скрипт:

$ pwd
~/projects/cow
$ ./bin/cow moo
# output here...

Однако для этого требуется, чтобы вы собрали свой гем из спецификации и установилиэто локально каждый раз, когда вы хотите проверить свои изменения:

ruby -I ./lib -r cow -e 'puts Cow.version'
0.0.1
gem build cow.gemspec && gem install cow-0.0.1.gem

Bundler облегчает жизнь, автоматически вставляя код в путь загрузки.Вам просто нужно запустить свой исполняемый файл через Bundler:

$ bundle exec ./bin/cow moo
# output here...
2 голосов
/ 15 марта 2012

Как насчет использования http://visionmedia.github.com/commander/? Никогда не использовал его раньше.Но это жемчужина, которая облегчает разработку приложений командной строки :) Делает тяжелую работу за вас.

Здесь есть еще куча: https://www.ruby -toolbox.com / Categories / CLI_Option_Parsers

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...