对于已编译的库,如 libyaml,Ruby(或 RVM)在文件系统中搜索何处以加载或解析它们?

Posted

技术标签:

【中文标题】对于已编译的库,如 libyaml,Ruby(或 RVM)在文件系统中搜索何处以加载或解析它们?【英文标题】:for compiled libraries, like libyaml, where does Ruby (or the RVM) search within the filesystem in order to load or resolve them? 【发布时间】:2012-09-22 15:02:56 【问题描述】:

操作系统:CentOS 6.2 x86_64 我为缩进不可靠而道歉。这是我的第一篇 SO 帖子,我是设置服务器的新手。我正在学习,并将详细说明我为解决这个问题所经历的步骤以及我在哪里寻求帮助。我是一名有抱负的年轻 Web 开发人员,我在其他人配置的服务器上工作,所以这整个体验对我来说是全新的。

我正在准备一个我最近购买的 linode 来运行一个 rails 应用程序。我按照此处提供的初始安装指南http://blog.blenderbox.com/2011/01/07/installing-rvm-ruby-rails-passenger-nginx-on-centos/,以及更改步骤:sudo bash < <( curl -L http://bit.ly/rvm-install-system-wide ) 反映此 SO 线程中建议的更改 RVM system-wide install script url broken -- what is replacement?

bash -c "bash <( curl -L https://github.com/wayneeseguin/rvm/raw/1.3.0/contrib/install-system-wide ) --version '1.3.0'"

我在安装 ngix 时停止了,因为我使用的是 Apache2。我还确保在安装 rails 之前运行 rvm requirements 并安装必要的软件包。这是 libyaml 的安装任务,第一个错误发生在我尝试安装它时。但是,yum 报告说它不存在。 RVM 和 Gems 的初始安装似乎可以工作,但是我遇到了 Gems 缺少“Psych”的问题,然后要求安装 libyaml: /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/yaml.rb:56:in '<top (required)>': It seems your ruby installation is missing psych (for YAML output). To eliminate this warning, please install libyaml and reinstall your ruby. 所以我首先尝试通过 Yum 安装 libyaml 但收到此错误:

yum install libyaml
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
* base: centosmirror.quintex.com
* extras: centosmirror.quintex.com
* updates: centosmirror.quintex.com
Setting up Install Process
No package libyaml available.
Error: Nothing to do

尝试安装 libyaml-devel 和 libyaml-dev 时遇到了同样的问题。 在做了一些研究后,我发现 CollectiveIdea 的这篇博客文章详细介绍了相同的问题并提供了解决方案。 Blog Post by Collective Idea 我按照说明进行了安装,没有任何制作或配置问题。然后我执行了提供的 ruby​​ 重新安装。我仍然收到相同的警告,并进一步搜索了类似问题的 SO。正如对这个问题关于同一问题的回答所详述的那样,how to solve "ruby installation is missing psych" error? 使用:

rvm pkg install libyaml
Fetching yaml-0.1.4.tar.gz to /usr/local/rvm/archives
Extracting yaml-0.1.4.tar.gz to /usr/local/rvm/src
Prepare yaml in /usr/local/rvm/src/yaml-0.1.4.
Configuring yaml in /usr/local/rvm/src/yaml-0.1.4.
Compiling yaml in /usr/local/rvm/src/yaml-0.1.4.
Installing yaml to /usr/local/rvm/usr

Please note that it's required to reinstall all rubies:

建议通过 RVM 重新安装所有内容,我也按照这些说明进行操作。

rvm reinstall all --force
Removing /usr/local/rvm/src/ruby-1.9.3-p194...
Removing /usr/local/rvm/rubies/ruby-1.9.3-p194...
mv: overwrite `/usr/local/rvm/user/installs'? y
No binary rubies available for: ///ruby-1.9.3-p194.
Continuing with compilation. Please read 'rvm mount' to get more information on binary   rubies.
Installing Ruby from source to: /usr/local/rvm/rubies/ruby-1.9.3-p194, this may take a while depending on your cpu(s)...
ruby-1.9.3-p194 - #downloading ruby-1.9.3-p194, this may take a while depending on your connection...

ruby-1.9.3-p194 - #extracting ruby-1.9.3-p194 to /usr/local/rvm/src/ruby-1.9.3-p194
ruby-1.9.3-p194 - #extracted to /usr/local/rvm/src/ruby-1.9.3-p194
ruby-1.9.3-p194 - #configuring
ruby-1.9.3-p194 - #compiling
ruby-1.9.3-p194 - #installing

即使在此之后,警告仍然存在。我已经用ruby -v 验证了 ruby​​ 安装,它实际上已经安装了。 libyaml 文件已安装,它们位于此处:

[root@li543-100 ~]# ls -la /usr/local/lib
total 19620
drwxr-xr-x  5 root root     4096 Oct  1 15:40 .
drwxr-xr-x 13 root root     4096 Oct  1 05:55 ..
drwxr-xr-x  2 root root     4096 Oct  1 06:34 include
lrwxrwxrwx  1 root root       16 Oct  1 15:40 libruby.so -> libruby.so.1.9.1
lrwxrwxrwx  1 root root       16 Oct  1 15:40 libruby.so.1.9 -> libruby.so.1.9.1
-rwxr-xr-x  1 root root  7457107 Oct  1 06:42 libruby.so.1.9.1
-rw-r--r--  1 root root 11633486 Oct  1 15:39 libruby-static.a
lrwxrwxrwx  1 root root       18 Oct  1 06:37 libyaml-0.so.2 -> libyaml-0.so.2.0.2
-rwxr-xr-x  1 root root   358698 Oct  1 06:37 libyaml-0.so.2.0.2
-rw-r--r--  1 root root   565584 Oct  1 06:37 libyaml.a
-rwxr-xr-x  1 root root      953 Oct  1 06:37 libyaml.la
lrwxrwxrwx  1 root root       18 Oct  1 06:37 libyaml.so -> libyaml-0.so.2.0.2
drwxr-xr-x  2 root root     4096 Oct  1 06:45 pkgconfig
drwxr-xr-x  6 root root     4096 Oct  1 06:45 ruby
-rw-rw-r--  1 root rvm       194 Oct  1 05:55 rvm

您还可以看到,我尝试在 /usr/local/lib 和 /usr/local/rvm/lib 之间创建符号链接,假设 yaml 文件可能已安装到错误的目录或 rvm没有为他们寻找正确的目录。我在 ruby​​ 上运行了一个 which 并认为因为 ruby​​ 位于 /rvm 目录中,这可能是问题所在:

[root@li543-100 ~]# which ruby
/usr/local/rvm/rubies/ruby-1.9.3-p194/bin/ruby
[1]: http://collectiveidea.com/blog/archives/2011/10/31/install-ruby-193-with-libyaml-on-centos/ 

这没有帮助。所以我对我出错的地方或我不想要的东西持谨慎态度。 1:是不是我把文件放在了错误的目录中导致安装错误? 2:ruby 是否在不同目录中寻找 libyaml 文件? 3:当我关注博客文章时,我是否未能在安装中添加一些系统特定的功能?

我已经在我的 linode 上重新部署了 CentOS 4 次,希望这是我没有正确遵循脚本的问题,我在第 5 次部署时出现了同样的问题。 我目前正在搜索 2 号,希望我的帖子不是不合适的,因为这显然在其他地方得到了解决。我将不胜感激您能提供的任何帮助。

编辑:

所以在重新部署 CentOS6.2 操作系统后,我运行了更改设置,如下所示:

yum -y install git
yum -y install curl
groupadd rvm
usermod -a -G rvm root
bash -c "bash <( curl -L https://github.com/wayneeseguin/rvm/raw/1.3.0/contrib/install-system-wide) -- version'1.3.0'"
echo '[[ -s "/usr/local/lib/rvm" ]] && . "/usr/local/lib/rvm" #This loads RVM into a shell session' >> ~/.bash_profile
source ~/.bash_profile
yum install -y gcc-c++ patch readline readline-devel zlib zlib-devel libyaml-devel libffi-devel openssl-devel make bzip2 autoconf automake libtool bison iconv-devel
rvm get head
yum install readline readline-devel
rvm package install libyaml -v
rvm install 1.9.3 -v
rvm use 1.9.3
ruby -v 

这也还是遇到了错误:

/usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/yaml.rb:56:in `<top (required)>':
It seems your ruby installation is missing psych (for YAML output).
To eliminate this warning, please install libyaml and reinstall your ruby.

运行之前的命令从 RVM 获取 libyaml,然后重新安装所有 rubies 似乎并不能解决我的问题。在执行 rvm reinstall all --force 时,之前安装的 libyaml 包会被删除、覆盖还是替换?它似乎位于正确的目录中。

[root@li543-100 src]# pwd
/usr/local/rvm/src
drwxrwsr-x  7 root rvm   4096 Oct  1 21:19 .
drwxrwsr-x 24 root rvm   4096 Oct  1 20:51 ..
drwxr-xr-x 24 root rvm   8192 Oct  1 21:22 ruby-1.9.3-p194
drwxr-xr-x  7  501 games 4096 Apr 27 23:31 rubygems-1.8.24
drwxrwsr-x 18 root rvm   4096 Oct  1 20:51 rvm
drwxrwsrwx  8 root rvm   4096 Oct  1 20:27 yaml-0.1.3
drwxr-xr-x  9 root rvm   4096 Oct  1 21:18 yaml-0.1.4

编辑#2: 在新的 CentOS 5.6 重新部署上再次安装失败后,我显然在安装过程中的某个地方制造了一个致命的缺陷。在执行rvm install 1.9.3 之前,我必须运行rvm install 1.8.7。另外,这次我部署的是 32bit CentOS6.2 镜像

在 1.8.7 上运行 gem

[root@li543-100 ~]# gem -v
1.8.24

现在我运行rvm install 1.9.2

[root@li543-100 ~]# rvm use 1.9.2
ruby-1.9.2-p320 is not installed.
To install do: 'rvm install ruby-1.9.2-p320'
[root@li543-100 ~]# rvm install ruby-1.9.2-p320
#CUT OUT INSTALL SHELL PROMPTS ETC
[root@li543-100 ~]# rvm use 1.9.2-p320
Using /usr/local/rvm/gems/ruby-1.9.2-p320
[root@li543-100 ~]# gem -v
1.8.24

切换到 1.9.3:错误返回

[root@li543-100 ~]# rvm use 1.9.3-p194
Using /usr/local/rvm/gems/ruby-1.9.3-p194
[root@li543-100 ~]# gem -v
/usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/yaml.rb:56:in `<top (required)>':
It seems your ruby installation is missing psych (for YAML output).
To eliminate this warning, please install libyaml and reinstall your ruby.
1.8.24

所以看起来告诉 rvm 使用 1.9.3(请注意,我使用的是 -p194,我之前没有测试过这些)在 rvm 尝试加载 libyaml 的位置方面会导致某种通信问题。现在我将使用 1.9.2,因为其中大部分内容都让我有点不知所措。我确定我在缺少 1.9.3 所需的某种依赖或未适当调整配置文件方面犯了一个错误。至少这是我的假设,第一个服务器设置这么多一直在猜测。

【问题讨论】:

【参考方案1】:

我已经单独构建了 libyaml,并且基本上经历了上述步骤的各种排列,结果相同。我运行了 irb,发现它没有找到 libyaml.so。无奈之下,我将 /usr/local/lib/libyaml*(我之前构建的)复制到 ~/.rvm/rubies/ruby-1.9.3-p327/lib。

这消除了警告。

【讨论】:

非常感谢。我几乎尝试了所有方法,直到有人提出这个建议!【参考方案2】:

经过多次试验,下面修复我

# rvm pkg install libyaml
# rvm reinstall all --force
# ln -s /usr/local/rvm/usr/lib/libyaml.so /usr/local/rvm/lib/
# ln -s /usr/local/rvm/usr/lib/libyaml-0.so.2 /usr/local/rvm/lib/
# ln -s /usr/local/rvm/usr/lib/libyaml-0.so.2 /usr/local/rvm/rubies/ruby-1.9.3-p327/lib
# ln -s /usr/local/rvm/usr/lib/libyaml.so /usr/local/rvm/rubies/ruby-1.9.3-p327/lib

我的环境

# cat /etc/redhat-release
CentOS release 5.8 (Final)

# ruby -v
ruby 1.9.3p327 (2012-11-10 revision 37606) [i686-linux]

# gem -v
1.8.24

# rvm -v

rvm 1.16.20 (latest) by Wayne E. Seguin <wayneeseguin@gmail.com>, Michal Papis <mpapis@gmail.com> [https://rvm.io/]

【讨论】:

也修复了 Red Hat Enterprise Linux Server 5.6 (Tikanga) 版【参考方案3】:

删除所有 rvm、ruby、libyaml 等

比安装rvm,只用rvm安装libyaml和rubies。

(还要注意 Ruby 可以查找 32 位库,因此请检查是否有 32 位版本,或者是否有单独的 lib 文件夹用于 64 位库!)

PS 去检查 heroku 以托管您的应用程序。非常适合初学者,因为它是免费的,并且 5 分钟即可设置(从安装 rails 到 rails 在 heroku 上自动生成的网页需要 15 分钟!)。而且您不需要更改配置,因此在您的服务器上进行部署不会更难。

【讨论】:

我现在正在准备一个脚本来做到这一点,并避免尝试从源代码编译和安装它。我会让你知道结果如何。谢谢你的回复 我添加了一个 EDIT 以反映我尝试简单地使用 RVM 安装 libyaml。

以上是关于对于已编译的库,如 libyaml,Ruby(或 RVM)在文件系统中搜索何处以加载或解析它们?的主要内容,如果未能解决你的问题,请参考以下文章

缺少必需的包裹? - 包括 libyaml

如何解决“ruby 安装缺少心理”错误?

清除正用于存储的已编译SAS宏的库

如何找出与 Ruby 一起打包的库的版本,例如json?

CMake post-build-event:复制已编译的库

干货连载编译器强大的库函数你了解多少——高数计算不用愁