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

StackOverflow https://stackoverflow.com/questions/124035

  •  02-07-2019
  •  | 
  •  

Вопрос

Недавно я преобразовал библиотеку 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 }'
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top