对gem工作方式的不理解

来源:互联网 发布:瘦下半身知乎 编辑:程序博客网 时间:2024/05/12 10:43

前几天在电脑上重新安装了fedora18,然后用yum工具安装了ruby和sqlite3

运行环境如下:

ruby 1.9.3p429 (2013-05-15 revision 40747) [x86_64-linux]
Rails 3.2.13

gem中安装了sqlite3 (1.3.7)

结果在执行rails generate scaffold ... 创建脚手架的时候 出现如下错误:

/usr/local/share/gems/gems/sqlite3-1.3.7/lib/sqlite3.rb:6:in `require': cannot load such file -- sqlite3/sqlite3_native (LoadError)from /usr/local/share/gems/gems/sqlite3-1.3.7/lib/sqlite3.rb:6:in `rescue in <top (required)>'from /usr/local/share/gems/gems/sqlite3-1.3.7/lib/sqlite3.rb:2:in `<top (required)>'from /usr/local/share/gems/gems/bundler-1.3.5/lib/bundler/runtime.rb:72:in `require'from /usr/local/share/gems/gems/bundler-1.3.5/lib/bundler/runtime.rb:72:in `block (2 levels) in require'from /usr/local/share/gems/gems/bundler-1.3.5/lib/bundler/runtime.rb:70:in `each'from /usr/local/share/gems/gems/bundler-1.3.5/lib/bundler/runtime.rb:70:in `block in require'from /usr/local/share/gems/gems/bundler-1.3.5/lib/bundler/runtime.rb:59:in `each'from /usr/local/share/gems/gems/bundler-1.3.5/lib/bundler/runtime.rb:59:in `require'from /usr/local/share/gems/gems/bundler-1.3.5/lib/bundler.rb:132:in `require'from /home/www/wanghaoming100_worbook/config/application.rb:7:in `<top (required)>'from /usr/local/share/gems/gems/railties-3.2.13/lib/rails/commands.rb:24:in `require'from /usr/local/share/gems/gems/railties-3.2.13/lib/rails/commands.rb:24:in `<top (required)>'from script/rails:6:in `require'from script/rails:6:in `<main>'

提示无法找到sqlite3/sqlite3_native 这个库文件, 查找一下sqlite3_native 显示如下:

./usr/local/lib64/gems/exts/sqlite3-1.3.7/lib/sqlite3/sqlite3_native.so./usr/local/share/gems/gems/sqlite3-1.3.7/ext/sqlite3/sqlite3_native.s

不知道这里面是什么问题,在系统的LOAD_PATH路径里

irb(main):006:0* $LOAD_PATH=> ["/usr/local/share/ruby/site_ruby", "/usr/local/lib64/ruby/site_ruby", "/usr/share/ruby/vendor_ruby", "/usr/lib64/ruby/vendor_ruby", "/usr/share/rubygems", "/usr/share/ruby", "/usr/lib64/ruby"]

没有找到gems的路径,查网上资料说,rubygems 会在系统找不到文件时,加载自己路径下的文件。

这里确实是加载了sqlite3.rb这个文件,但是找不到ext文件夹下面的库文件,没有弄明白这内部的加载机制,只能手动把/usr/local/share/gems/gems/sqlite3-1.3.7/lib/sqlite3.rb

中的:

 require 'sqlite3/sqlite3_native'

改为


./usr/local/share/gems/gems/sqlite3-1.3.7/ext/sqlite3/sqlite3_native.so 绝对路径,然后运行,正常执行。

还是不甘心,重新运行了一次gem install sqlite3


然后再查找一次sqlite3_native.so,发现这次sqlite3安装到了用户主目录的.gem文件下,之前可能是用root用户安装的sqlite3,如下:

./home/www/.gem/ruby/1.9.1/gems/sqlite3-1.3.7/ext/sqlite3/sqlite3_native.so
./home/www/.gem/ruby/1.9.1/gems/sqlite3-1.3.7/lib/sqlite3/sqlite3_native.so


我们看到,这次的sqlite3_native.so的路径和root下安装的sqlite3的路径略有变化,没有了ext路径。 在不改动的源代码的情况下,重新用心rails generate

运行成功。

这里的问题就在于不理解requir的加载机制,不知道它到什么路径去找文件。另外终端中echo $GEM_HOME为空,irb中$GEM_HOME也为空。以后等对ruby

更了解的情况下还是要研究以下require的加载机制。









原创粉丝点击