Как на самом деле работает ruby ​​`require`?

Я использую Archlinux, местоположение ruby ​​​​было в /usr/bin/ruby

$ ruby --version 
ruby 2.0.0p247 (2013-06-27 revision 41674) [i686-linux]
$ gem install ffi
Building native extensions.  This could take a while...
Successfully installed ffi-1.9.0
Parsing documentation for ffi-1.9.0
Done installing documentation for ffi after 41 seconds
1 gem installed

Я использовал G-WAN для выполнения ruby-скрипта, но когда я использую require 'ffi', отображается этот вывод:

/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:45:in `require': cannot load such file -- ffi (LoadError)
    from /usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:45:in `require'
    from /home/asd/bin/gwan_linux32-bit/127.0.0.1_8081/#127.0.0.1/csp/test.rb:1:in `<main>'

и require '/home/asd/.gem/ruby/2.0.0/gems/ffi-1.9.0/lib/ffi.rb' показывает:

/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:45:in `require': cannot load such file -- ffi_c (LoadError)
    from /usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:45:in `require'
    from /home/asd/.gem/ruby/2.0.0/gems/ffi-1.9.0/lib/ffi.rb:14:in `rescue in <top (required)>'
    from /home/asd/.gem/ruby/2.0.0/gems/ffi-1.9.0/lib/ffi.rb:3:in `<top (required)>'
    from /usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:45:in `require'
    from /usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:45:in `require'
    from /home/asd/bin/gwan_linux32-bit/127.0.0.1_8081/#127.0.0.1/csp/test.rb:21:in `<main>'

вывод p $LOAD_PATH был:

["/usr/lib/ruby/site_ruby/2.0.0" # doesn't exists
, "/usr/lib/ruby/site_ruby/2.0.0/i686-linux" # doesn't exists
, "/usr/lib/ruby/site_ruby" # doesn't exists
, "/usr/lib/ruby/vendor_ruby/2.0.0" # doesn't exists
, "/usr/lib/ruby/vendor_ruby/2.0.0/i686-linux" # doesn't exists
, "/usr/lib/ruby/vendor_ruby" # doesn't exists
, "/usr/lib/ruby/2.0.0" 
, "/usr/lib/ruby/2.0.0/i686-linux"
]

место для FFI было:

$ locate ffi.rb
/home/asd/.gem/ruby/2.0.0/gems/ffi-1.9.0/lib/ffi.rb
/home/asd/.gem/ruby/2.0.0/gems/ffi-1.9.0/lib/ffi/ffi.rb
/opt/jruby/lib/ruby/shared/ffi.rb
/opt/jruby/lib/ruby/shared/ffi/ffi.rb
/opt/jruby/samples/ffi/ffi.rb

поэтому я попытался добавить каталог в $ LOAD_PATH

$LOAD_PATH.unshift '/home/asd/.gem/ruby/2.0.0/gems/ffi-1.9.0/lib'

и теперь require 'ffi' не показывает ошибки..

если у меня уже установлено много драгоценных камней на ~/.gem/ruby/2.0.0/gems

$ ll ~/.gem/ruby/2.0.0/gems/ | wc
285    2558   17502

как правильно использовать драгоценный камень? это путем добавления каждого пути к $ LOAD_PATH


person Kokizzu    schedule 23.07.2013    source источник
comment
вы используете системный рубин и вызываете драгоценный камень в пользовательском каталоге. Попробуйте rvm   -  person egghese    schedule 23.07.2013
comment
нет, я вообще не хочу использовать rvm ^^..   -  person Kokizzu    schedule 23.07.2013
comment
@JeslyVarghese: Как бы вы подключили RVM к G-WAN?   -  person icktoofay    schedule 23.07.2013
comment
Требование драгоценных камней происходит очень-очень медленно...   -  person solisoft    schedule 25.07.2013


Ответы (1)


Это явно проблема конфигурации Ruby, и предлагаемый инструмент RVM, похоже, решает ее:

RVM — это инструмент командной строки, который позволяет легко устанавливать, управлять и работать с несколькими средами ruby, от интерпретаторов до наборов гемов.

Как предложил icktoofay, G-WAN может добавить поддержку RVM, но я не уверен, что это имеет смысл, если только RVM не станет более популярным, чем сам Ruby (или не ассимилируется Ruby).

Jesly Varghese также сообщил нам (выше), что проблема возникает из-за того, что "вы используете системный ruby ​​и вызываете gem в пользовательском каталоге".

Вы пытались установить G-WAN под /opt/gwan? Тогда эта проблема с PATH может исчезнуть.

person Gil    schedule 24.07.2013