2012-03-14 2 views
2

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

Например:

$ cow moo 

бы корова камень со скриптом для команды коровы и выполнять функцию «» му в драгоценный камень Ruby.

Если бы я мог, я хотел бы также поддержку форматирования общих «Параметры» в оболочке:

$ cow -t moo 

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

Если кто-то может помочь нам с этим, это будет большой помощью. Благодаря!

ответ

2

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

Существует куча более здесь: https://www.ruby-toolbox.com/categories/CLI_Option_Parsers

+0

Нет, как сказано, у меня нет опыта с ними. Но я бы предположил, что это возможно. Возможно, проверьте исходный код драгоценного камня и посмотрите, как они пишут тесты для проверки структуры. – SpoBo

+0

@Beakr, вы можете построить и установить свой драгоценный камень, не нажимая его на рубигемы, или просто использовать Bundler. Прочтите мой ответ для деталей. –

5

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

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

Cow.say ARGV.first 

Обратите внимание на первую линию, которая является shebang line. Он сообщает вашей оболочке, какую программу использовать для интерпретации сценария. Это позволяет пользователю просто позвонить 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, но есть также many gems.

Я создал my own option parser, called 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... 
+1

Спасибо за подсказку. – beakr

Смежные вопросы