rails 服务器无法在 OSX 10.6.5 上使用 rvm 和 ruby​​ 1.9.2-p0 启动 mysql2

Posted

技术标签:

【中文标题】rails 服务器无法在 OSX 10.6.5 上使用 rvm 和 ruby​​ 1.9.2-p0 启动 mysql2【英文标题】:rails server fails to start with mysql2 using rvm & ruby 1.9.2-p0 on OSX 10.6.5 【发布时间】:2011-05-29 13:57:34 【问题描述】:

我在启动 Rails 服务器时遇到以下错误:

$ rails server
/Users/ssmith/.rvm/gems/ruby-1.9.2-p0/gems/mysql2-0.2.6/lib/mysql2.rb:7:in `require':     dlopen(/Users/ssmith/.rvm/gems/ruby-1.9.2-p0/gems/mysql2-0.2.6/lib/mysql2/mysql2.bundle, 9): Library not loaded: libmysqlclient.16.dylib (LoadError) 
Referenced from: /Users/ssmith/.rvm/gems/ruby-1.9.2-p0/gems/mysql2- 0.2.6/lib/mysql2/mysql2.bundle
Reason: image not found - /Users/ssmith/.rvm/gems/ruby-1.9.2-p0/gems/mysql2-    
0.2.6/lib/mysql2/mysql2.bundle

我在 rvm 使用 ruby​​-1.9.2-p0 命令后使用以下命令安装了 mysql2:

$ gem install mysql2 -- --with-mysql-dir=/usr/local/mysql --with-mysql-config=/usr/local/mysql/bin/mysql_config
Building native extensions.  This could take a while...
Successfully installed mysql2-0.2.6
1 gem installed
Installing ri documentation for mysql2-0.2.6...
Enclosing class/module 'mMysql2' for class Client not known
Installing RDoc documentation for mysql2-0.2.6...
Enclosing class/module 'mMysql2' for class Client not known

我的 Gemfile 和 database.yml 文件中都有 mysql2,并且捆绑安装可以正常完成

$ bundle show mysql2
/Users/ssmith/.rvm/gems/ruby-1.9.2-p0/gems/mysql2-0.2.6

我知道 Rails 服务器错误是由于它不知道 OSX 上的 mysql_config 位置,但是在 gem install 上我指定了正确的位置。然而,RVM 的 gem 似乎并不尊重 mysql_config 位置。

谁有办法解决这个问题?

【问题讨论】:

【参考方案1】:

问题来自于 mysql2 gem 缺少 MySQL 的动态库。

install_name_tool ... 更简洁的解决方案需要更新您的DYLD_LIBRARY_PATH 以向其中添加MySQL 库。为此,请更新您的 ~/.bash_profile 以添加 MySQL 库文件夹:

export DYLD_LIBRARY_PATH="/usr/local/mysql/lib:$DYLD_LIBRARY_PATH"

注意:您可能希望根据您的安装更新 MySQL 位置

这应该保持干净,但也确保任何需要 MySQL 动态库的 gem 或代码都能找到它们。

参考:http://lightyearsoftware.com/2011/02/mysql-5-5-on-mac-os-x/

参考更新 2012 年 7 月: OS X 10.8 中的更改使上述简单方法不那么优雅。如果设置该变量,则每次运行 setuid 或 setgid 程序时,都会在 stderr 上收到以下警告:

dyld: DYLD_ environment variables being ignored because main executable (...) is setuid or setgid

使用 Phusion Passenger Standalone 的 Ruby 开发人员每五秒就会在他们的控制台中看到此消息。它变得非常烦人,非常快。

我已向 Apple 提交了一个错误。它也在 OpenRadar。

同时,还有第三种方法可以解决客户端库路径问题,无需设置 DYLD_LIBRARY_PATH(解决此 10.8 问题)或使用 install_name_tool 破解 .bundle 文件:

$ brew install mysql

【讨论】:

如果您使用的是 pow 或乘客,这将不起作用,请使用 Frederic 上面的答案使其工作......确保在 gem basedir 中的“ext”文件夹中运行它好 如果您仍然遇到相同的错误,请尝试卸载并在执行此操作后重新安装 mysql2 gem。为我工作【参考方案2】:

我在这里找到了答案:Mysql 5.5, Snow leopard and rails

sudo install_name_tool -change libmysqlclient.16.dylib /usr/local/mysql/lib/libmysqlclient.16.dylib ~/.rvm/gems/ruby-1.9.2-p0/gems/mysql2-0.2.6/lib/mysql2/mysql2.bundle

【讨论】:

此解决方案的问题在于,每次(重新)安装 gem(一个示例:在不同的 RVM gemset 中)时,您都必须重复 install_name_tool 命令。在我看来,Sébastien 的回答引用了我的博客文章,提供了一个更简洁的解决方案。 请注意,库版本也会发生变化——目前它是 libmysqlclient.18.dylib(而不是 16),需要在上面的两个地方替换。【参考方案3】:

在 OS X 10.8 (Mountain Lion) 上,列出的答案都有问题,如答案和 cmets 中所述。

DYLD_LIBRARY_PATH 设置为包含 /usr/local/mysql/lib 会发出来自 OS X 和 brew 的警告 使用install_name_tool 破解每次安装或升级gem 时需要重做gem 二进制文件的位置。 切换到brew的mysql可能不行;并且无论如何我都不想重新配置已经工作的安装

恕我直言,一个更简单、更强大的解决方案是将指向库的链接放在默认动态库搜索路径中,该路径方便地包括/usr/local/lib。那就是:

ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/lib

【讨论】:

太棒了,我尝试了以上所有方法,这个立即奏效了【参考方案4】:

比尔,

Frederic 的回答将解决此问题,但是您可能需要根据版本和系统上的命名方式更改命令中的某些项目。

例如,在最新版本的 mysql 上,libmysqlclient.16.dylib 实际上是 libmysqlclient.18.dylib。尝试做一个:

locate libmysqlclient.18.dylib

如果没有返回你可以去的路径:

/usr/local/your-mysql/lib

查找文件。然后只需一个 PWD 即可找到该命令的正确目录。

您还需要确定您已安装的 rubies 的实际软件包名称。您可以使用

找到它
rvm info 

例如,我安装的 1.9.2 是 ruby​​-1.9.2.p180,而不是 ruby​​-1.9.2p0。这也需要在 Frederics 命令中进行更改。

所以,对我来说,Frederic 的命令变成了分别修复 1.8.7 和 1.9.2 的 rvm 红宝石:

sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql-5.5.10-osx10.6-x86_64/lib/libmysqlclient.18.dylib ~/.rvm/gems/ruby-1.8.7-p334/gems/mysql2-0.2.6/lib/mysql2/mysql2.bundle

sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql-5.5.10-osx10.6-x86_64/lib/libmysqlclient.18.dylib ~/.rvm/gems/ruby-1.9.2-p180/gems/mysql2-0.2.6/lib/mysql2/mysql2.bundle

【讨论】:

【参考方案5】:

以下来自:http://lightyearsoftware.com/2011/02/mysql-5-5-on-mac-os-x/

2012 年 7 月更新:

OS X 10.8 中的更改使上述简单方法不那么优雅。如果您设置了该变量,则每次运行 setuid 或 setgid 程序时,您都会在 stderr 上收到以下警告:

dyld: DYLD_ environment variables being ignored because main executable (...) is setuid or setgid

使用 Phusion Passenger Standalone 的 Ruby 开发人员每五秒就会在他们的控制台中看到此消息。它变得非常烦人,非常快。

我已向 Apple 提交了一个错误。它也在 OpenRadar。

同时,还有第三种方法可以解决客户端库路径问题,无需设置 DYLD_LIBRARY_PATH(解决此 10.8 问题)或使用 install_name_tool 破解 .bundle 文件:

$ brew install mysql

【讨论】:

【参考方案6】:

我在这个问题上停留了一段时间,然后找到了一个不同的解决方案。

注意缺少的库是版本 16

库未加载:libmysqlclient.16.dylib (LoadError)

原来我有那个库的第 20 版 - libmysqlclient.20.dylib

我的 Gemfile 中正确地有 gem 'mysql2',但我需要做的是卸载 gem,gem uninstall mysql(我安装了多个版本的 gem)然后做一个新的 bundle install 来获取 只是我需要的这个库的版本。

之后它寻找并找到了该库的正确版本。

【讨论】:

【参考方案7】:

我的位置不同,我不得不使用:

sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib /Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundle.

【讨论】:

【参考方案8】:

将 mysql 升级到最新版本并重新安装 mysql2 gem 对我有用 brew upgrade mysql gem uninstall mysql2 gem install mysql2

顺便说一句:我的 MySQL 版本是 5.7.18,mysql2 gem 版本是 0.4.5

【讨论】:

【参考方案9】:

这是我的工作(与其他人类似)

sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib ~/.rvm/gems/ruby-1.9.2-p290/gems/mysql2-0.3.10/lib/mysql2/mysql2.bundle

【讨论】:

以上是关于rails 服务器无法在 OSX 10.6.5 上使用 rvm 和 ruby​​ 1.9.2-p0 启动 mysql2的主要内容,如果未能解决你的问题,请参考以下文章

Rails:在 OS X 上安装 PG gem - 无法构建本机扩展

rails 4.2.0:无法在 ubuntu 14.04 上安装 pg gem

让 wkhtmltoimage 在 Amazon Linux / Ruby on Rails 上工作的问题

无法在 osx 上使用 nginx + gunicorn 查看静态文件

使用 Ruby On Rails 4.2.5.1 我可以 gem install therubyracer 但捆绑包在 OS X 10.11.1 上失败

升级到 OSX 10.7 Lion 后修复 Postgresql