对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的加载机制。
- 对gem工作方式的不理解
- 计算机行业对工作方式的发展
- 一些不理解的地方
- 一种不理解的写法
- 不理解的问题
- 关于对安卓handler的工作方式的理解
- Gemfile指定gem来源的四种方式
- Gemfile指定gem来源的四种方式
- 新手刚刚接触SASS对安装与编译上面的不理解
- 一个android不理解的问题
- JSONP跨越不理解的地方
- gem 用代理连接方式
- gem 卸载所有的gem, 重新安装某类型的gem
- Rails gem: 用于开发的gem 推荐
- 对工作的理解
- 对工作的理解
- 对工作的态度
- HTTP_REFERER的工作方式
- 数据库三范式
- ListView的setSelection()不起作用的原因
- LINUX 第五章
- 由SendMessageTimeout想到的。SendMessageTimeout 和 SendMessage
- 线段树
- 对gem工作方式的不理解
- Android开机自启动程序
- 航模笔记: 电池
- Linux下UP-CUP S2440型产品光盘环境的安装与配置
- DevOps
- 关于unbound prefix错误
- java中this和super的用法
- 黑马程序员 IO流-->其它流对象以及一些重要类
- ZOJ和PKU 题目分类