使用RVM管理Ruby时已安装nokogiri却无法加载的问题
这种情况我在维护老Ruby项目时也碰到过,结合你给出的信息,大概率是Ruby环境的隔离性或加载路径匹配问题,给你几个排查方向和解决办法:
检查RVM Gemset是否一致
RVM的Gemset是用来隔离不同项目依赖的核心机制,很可能你安装nokogiri时用的Gemset和运行脚本时激活的不是同一个。先运行rvm gemset list查看当前终端激活的Gemset,再确认nokogiri是否安装在这个Gemset里(可以用rvm gemset use [gemset名称] && gem list来验证)。如果不一致,要么切换到安装了nokogiri的Gemset,要么在当前Gemset里重新安装一遍nokogiri。验证Gem安装路径与Ruby加载路径匹配
虽然which ruby和which gem指向RVM路径,但偶尔会出现Gem安装位置和Ruby预期加载路径不匹配的情况。你可以:- 运行
gem which nokogiri获取nokogiri的实际安装路径 - 运行
ruby -e "puts $:"查看Ruby的加载路径数组 - 检查第一步得到的路径是否包含在第二步的数组里。如果不在,可以尝试重新安装nokogiri,或者在脚本开头手动添加加载路径:
$:.unshift('/path/to/nokogiri/lib')
- 运行
检查脚本的Shebang行
如果你的脚本开头有类似#!/usr/bin/ruby的硬编码路径,可能会绕过RVM激活的Ruby环境,调用系统默认的Ruby(而系统Ruby里没有安装nokogiri)。建议把Shebang改成#!/usr/bin/env ruby,这样会优先使用终端当前激活的RVM Ruby环境;或者直接用RVM Ruby的绝对路径来运行脚本,比如:~/.rvm/rubies/ruby-1.8.7-head/bin/ruby your_script.rb针对Ruby 1.8.7重新安装Nokogiri
Ruby 1.8.7是非常老旧的版本,Nokogiri 1.4.7对它的兼容性需要特殊处理。尝试用指定平台的方式重新安装,避免预编译版本的兼容性问题:gem install nokogiri -v 1.4.7 --platform=ruby
内容的提问来源于stack exchange,提问作者Kyle Calica-St

