我正试图让Ruby gem"Nokogiri"在没有root权限的Solaris机器上运行。到目前为止我所做的:
- 我在主目录中构建了自己的ruby版本(1.9.2p180)
- 尝试用"geminstall nokogiri"安装nokogili
gem安装程序随后抛出了以下错误:
Building native extensions. This could take a while...
ERROR: Error installing nokogiri:
ERROR: Failed to build gem native extension.
/home/bender/ruby/bin/ruby extconf.rb
checking for libxml/parser.h... yes
checking for libxslt/xslt.h... yes
checking for libexslt/exslt.h... yes
checking for iconv_open() in iconv.h... no
checking for iconv_open() in -liconv... no
-----
libiconv is missing. please visit http://nokogiri.org/tutorials/installing_nokogiri.html for help with installing dependencies.
所以我在/home/myuser/work/liiconv 中下载并构建了libiconv
$ ls /home/myuser/work/libiconv/
bin build include lib share
并将这些位置作为nokogiri的参数:
gem install nokogiri -- --with-iconv-dir=/home/myuser/work/libiconv --with-iconv-include=/home/myuser/work/libiconv/include --with-iconv-lib=/home/myuser/work/libiconv/lib
现在gem构建并且没有显示任何错误。问题是,当我现在尝试使用它时,例如在irb中,它不知何故无法加载:
require 'nokogiri'
LoadError: ld.so.1: ruby: fatal: libiconv.so.2: open failed: No such file or directory - /home/myuser/ruby/lib/ruby/gems/1.9.1/gems/nokogiri-1.4.4/lib/nokogiri/nokogiri.so
from /home/myuser/ruby/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
from /home/myuser/ruby/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
from /home/myuser/ruby/lib/ruby/gems/1.9.1/gems/nokogiri-1.4.4/lib/nokogiri.rb:13:in `<top (required)>'
from /home/myuser/ruby/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:57:in `require'
from /home/myuser/ruby/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:57:in `rescue in require'
from /home/myuser/ruby/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:35:in `require'
from (irb):1
from /home/myuser/ruby/bin/irb:12:in `<main>'
但当我寻找应该缺失的文件时,它就在那里,而且可读/可执行:
ll /home/myuser/ruby/lib/ruby/gems/1.9.1/gems/nokogiri-1.4.4/lib/nokogiri/
total 66
...
-rwxr-xr-x 1 myuser group 370552 Jun 6 22:53 nokogiri.so
...
好吧,那就是我被卡住的地方。。文件在那里,但无法打开?我试图重建性欲,但没有效果。Nokogiri没有抛出任何构建过程失败的错误。所以我不知道如何解决这个问题,谷歌也无法给我答案。我希望这里有人能给我一些提示。
/编辑
我在谷歌上搜索了更多,发现这篇帖子中有人使用ldd来显示依赖关系。当我为nokogiri做同样的事情时,它说:
ldd /home/myuser/ruby/bin/nokogiri
ldd: /home/myuser/ruby/bin/nokogiri: unsupported or unknown file type
我想这是因为它是一个ruby文件,但如果它是相关的,我想提到它。
如果您使用GNU binutils,请尝试设置
LDFLAGS="-Wl,-rpath /home/myuser/work/libiconv/lib"
如果它是Solaris链接器,那么它就像-X,我真的不记得了。只需查看ld的手册页中的运行路径设置即可。它将允许运行时链接器查找.so.
如果您要构建自己的沙箱,为什么不使用RVM来完成所有繁重的工作呢?它在生活中的目的是在~/.rvm
中创建一个用户沙箱,构建和管理您想要运行的Ruby版本以及与您的项目相关的gemset。
如果您决定使用我强烈建议的路径,请确保遵循链接页面上的单用户安装说明,如果您不使用*配置文件,请向~/.bash_profile
或~/.bashrc
添加适当的字符串,并在运行rvm notes
时遵循RVM输出的建议。
我在几个Centos、Ubuntu和Mac操作系统上安装了它,我在那里进行开发,我觉得它很棒。