Ключи командной строки ruby ​​-rubygems & -r несовместимы?

Я недавно преобразовал библиотеку Ruby в драгоценный камень, который, казалось, нарушил удобство использования командной строки

Работала нормально как библиотека

  $ ruby -r foobar -e 'p FooBar.question' # => "answer"

И как драгоценный камень irb знает, как требовать драгоценный камень из параметров командной строки.

  $ irb -rubygems -r foobar
  irb(main):001:0> FooBar.question # => "answer"

Но то же самое не касается самого рубина:

  $ 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 переключателя?

Примечание: я знаю, что драгоценный камень может добавить корзину / программу для каждого полезного метода, но мне не нравится без надобности загрязнять пространство имен командной строки

Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
6
0
3 004
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

-rubygems фактически то же самое, что -r ubygems.

Насколько я понимаю, это не мешает вашему пути поиска, но я думаю, что это не добавляет ничего и к вашему пути поиска -r. Мне удалось сделать что-то вроде этого:

ruby -rubygems -r /usr/lib/ruby/gems/myhelpfulclass-0.0.1/lib/MyHelpfulClass -e "puts MyHelpfulClass"

MyHelpfulClass.rb существует в указанном выше каталоге lib.

Это отстой, но он, по крайней мере, демонстрирует, что у вас может быть несколько директив -r equire.

В качестве немного менее уродливого обходного пути вы можете добавить дополнительные элементы в путь поиска библиотеки ruby ​​(двоеточие с разделителями в * nix, точка с запятой в окнах).

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"

Вы правы (обратите внимание на 'ubygems.rb' в ruby ​​/ site_ruby / 1.8), но тогда почему он не работает с требованиями 2? Это меняет путь загрузки или что-то в этом роде?

Orion Edwards 24.09.2008 01:44

Требуется ли здесь переключатель -rubygems? Могу ли я указать -r MyHelpfulClass без переключателя -rubygems?

Donato 07.06.2016 04:11

Примечание: эта проблема существует для 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 }'

Другие вопросы по теме