Несовместимы ли переключатели командной строки ruby -rubygems & -r?
Вопрос
Недавно я преобразовал библиотеку ruby в gem, что, похоже, нарушило удобство использования командной строки
Прекрасно работал как библиотека
$ ruby -r foobar -e 'p FooBar.question' # => "answer"
И как драгоценный камень, irb знает, как потребовать драгоценный камень от переключателей командной строки
$ irb -rubygems -r foobar
irb(main):001:0> FooBar.question # => "answer"
Но то же самое не удается и для самого ruby:
$ ruby -rubygems -r foobar -e 'p FooBar.question'
ruby: no such file to load -- foobar (LoadError)
должен ли я сейчас сделать это, что кажется уродливым:
ruby -rubygems -e 'require "foobar"; p FooBar.question' # => "answer"
Или есть способ заставить работать 2 переключателя?
Примечание:Я знаю, что gem мог бы добавить bin / program для каждого полезного метода, но мне не нравится без необходимости загрязнять пространство имен командной строки
Решение
-rubygems на самом деле то же самое, что и -r ubygems.
Насколько я понимаю, это не влияет на ваш путь поиска, но я думаю, что это также ничего не добавляет к вашему пути поиска -r.Я смог сделать что-то вроде этого:
ruby -rubygems -r /usr/lib/ruby/gems/myhelpfulclass-0.0.1/lib/MyHelpfulClass -e "puts MyHelpfulClass"
MyHelpfulClass.rb существует в каталоге lib, указанном выше.
Это своего рода отстой, но это, по крайней мере, демонстрирует, что у вас может быть несколько директив equire.
В качестве чуть менее уродливого решения вы можете добавить дополнительные элементы в путь поиска библиотеки ruby (разделенные двоеточием в * nix, точкой с запятой в Windows).
export RUBYLIB=/usr/lib/ruby/gems/1.8/gems/myhelpfulclass-0.0.1/lib
ruby -rubygems -r MyHelpfulClass -e "puts MyHelpfulClass"
Если вы не хотите возиться с переменной окружения, вы можете сами добавить что-нибудь в путь загрузки:
ruby -I /usr/lib/ruby/gems/1.8/gems/myhelpfulclass-0.0.1/lib \
-rubygems -r MyHelpfulClass -e "puts MyHelpfulClass"
Другие советы
Примечание:эта проблема существует для ruby 1.8, но решена в ruby 1.9.
В версии 1.8, если вы укажете обе библиотеки через -r
, ruby попытается загрузить каждую библиотеку , не обращая внимания на изменения в $LOAD_PATH
.Но rubygems действительно меняется $LOAD_PATH
так что драгоценные камни можно найти.
Причина, по которой это работает с irb
это что irb
делает обратите внимание на $LOAD_PATH
Изменения.
К сожалению, лучшее решение, которое я нашел, - это использовать более подробную форму:
ruby -rubygems -e 'require "foobar"; p FooBar.question'
Однако боль не увеличивается линейно с увеличением количества библиотек, если вы используете итератор:
ruby -rubygems -e '%w(rake rspec).each{|r| require r }'