Вы можете создать регулярный исполняемый файл с именем 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...
Нет, как сказано, у меня нет опыта с ними. Но я бы предположил, что это возможно. Возможно, проверьте исходный код драгоценного камня и посмотрите, как они пишут тесты для проверки структуры. – SpoBo
@Beakr, вы можете построить и установить свой драгоценный камень, не нажимая его на рубигемы, или просто использовать Bundler. Прочтите мой ответ для деталей. –