Являются ли ключи командной строки ruby ​​-rubygems & -r несовместимыми? - PullRequest
6 голосов
/ 24 сентября 2008

Я недавно преобразовал библиотеку 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 переключателя?

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

Ответы [ 2 ]

7 голосов
/ 24 сентября 2008

-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, точка с запятой, разделенное в 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"
0 голосов
/ 04 января 2013

Примечание: эта проблема существует для 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 }'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...