RubyGem 与 mysql 的问题

RubyGem 与 mysql 的问题

我有点困惑...我的服务器从 2.1.1 升级到 2.3.2,当我的混合集群尝试启动时出现以下错误:

Exception `Gem::LoadError' at /usr/lib/ruby/site_ruby/1.8/rubygems.rb:578 - Could not find RubyGem activerecord-mysql-adapter (>= 0)

这是什么原因造成的?我做过以下事情:

gem install mysql

...使用各种特定于路径的魔法来安装它。谷歌搜索发现了一些类似的问题,但没有明显的解决办法。有什么想法吗?

更多信息:

版本:Rails 2.3.2(通过gem)、RubyGems 1.3.4(通过gem)、Ruby 1.8.5(通过yum)、Linux 2.6.18-xen(CentOS 5.2)。

MySQL 适配器(gem install mysql)是 2.7。

奇怪的是,如果我删除 mysql 适配器 ( gem uninstall mysql),我希望它会恢复为内置 (虽然很慢...?) MySQL 适配器。它的行为没有任何不同。

答案1

造成这种情况的根本原因是 Rails 2.3 允许外部 gem 提供连接适配器,而不是将它们全部捆绑在一起。activerecord-2.3.2/lib/active_record/connection_adapters/abstract/connection_specification.rb如果您感兴趣,可以查看详细信息,但简而言之,establish_connection 将尝试执行的第一件事是加载 gem,如果失败,则执行“传统”的 require(将加载内置的 mysql 适配器)。

通过引发 来表示“失败” LoadError,这就是事情变得烦人的地方。Rubygems 有自己的LoadError类 ( Gem::LoadError),我思考问题就出在这里,因为 activerecord 没有正确检测到(预期的)故障已经发生,所以导致崩溃,而不是仅仅尝试在本地加载连接适配器。

您将来可能会后悔做的一个愚蠢的事情是将activerecord-2.3.2/lib/active_record/connection_adapters/abstract/connection_specification.rb第 72 行更改为:

rescue LoadError, Gem::LoadError

修复此问题的正确方法是找出环境中导致此问题的原因(因为显然不是每个人都会遇到此问题)。我的第一个猜测是您正在运行旧版本的 RubyGems(例如,版本 1.3.3 中的 ruby​​gems.rb 的第 578 行与加载错误无关),或者运行奇怪的(可能已过期的)Ruby 版本。我会确保您正在运行最新的 Rubygems(Rails 2.3 至少需要 1.3.1 才能正常运行,我想这可能是您遇到的问题),并且您的 Ruby 版本不是太过分(使用 1.8.6 或 1.8.7,并且我会谨慎使用 1.9 版本)。

如果所有操作均正常但问题仍然存在,请提供系统的完整详细信息(操作系统、发行版、Ruby/rubygems 的来源(软件包、源代码等)、以上所有内容的版本、任何自定义),然后有人可以彻底解决问题。就目前而言,您没有提供任何可帮助任何人追踪问题的信息。

相关内容