RVM和MySQL下的Ruby 1.9.2已经初始化了持续警告

时间:2010-08-06 17:49:24

标签: ruby-on-rails ruby-1.9 bundler sql

在RVM下使用Ruby 1.9.2.rc2运行Rails 3 RC时,我不断从MySQL驱动程序包中获得大量错误,如下所示:

/opt/local/rvm/gems/ruby-1.9.2-rc2/gems/mysql-2.8.1/lib/mysql_api.bundle: warning: already initialized constant MysqlRes
/opt/local/rvm/gems/ruby-1.9.2-rc2/gems/mysql-2.8.1/lib/mysql_api.bundle: warning: already initialized constant MysqlField
/opt/local/rvm/gems/ruby-1.9.2-rc2/gems/mysql-2.8.1/lib/mysql_api.bundle: warning: already initialized constant MysqlError
/opt/local/rvm/gems/ruby-1.9.2-rc2/gems/mysql-2.8.1/lib/mysql_api.bundle: warning: already initialized constant VERSION
/opt/local/rvm/gems/ruby-1.9.2-rc2/gems/mysql-2.8.1/lib/mysql_api.bundle: warning: already initialized constant OPT_CONNECT_TIMEOUT
/opt/local/rvm/gems/ruby-1.9.2-rc2/gems/mysql-2.8.1/lib/mysql_api.bundle: warning: already initialized constant OPT_COMPRESS
/opt/local/rvm/gems/ruby-1.9.2-rc2/gems/mysql-2.8.1/lib/mysql_api.bundle: warning: already initialized constant OPT_NAMED_PIPE
/opt/local/rvm/gems/ruby-1.9.2-rc2/gems/mysql-2.8.1/lib/mysql_api.bundle: warning: already initialized constant INIT_COMMAND

这显示在rails console和单元测试中,任何需要完整Rails堆栈的内容,但不是直接在同一环境中使用Sequel的脚本。

虽然bundle本身确实加载并且MySQL驱动程序确实有效,但是这一大堆警告预示着任何通过Rails运行的东西。通常这是由于Rails环境中某处mysql gem的冗余加载造成的。 gem在Gemfile中声明:

gem 'rails', '3.0.0.rc'

gem 'haml'
gem 'sequel'

gem 'mysqlplus'
gem 'mysql'

我认为这是Rails自动加载器无法理解已加载的Mysql库,并再次加载它。有没有一种简单的方法来解决这个问题?

更新

同时加载mysqlmysqlplus但不能同时加载两者,否则您会收到类似警告。 mysqlplus包含mysql的所有功能,并且是续集的依赖。

1 个答案:

答案 0 :(得分:1)

你需要mysqlplus宝石吗?我只使用Rails 3和mysql 2.8.1:

gem 'mysql', '2.8.1'

虽然我没有使用mysqlplus,但我猜它会在警告中设置你看到的常量,然后mysql gem在加载时再次设置这些常量。

更新:改用mysql2

#gem 'mysql', '2.8.1'
gem 'mysql2'

您还需要在database.yml中更新数据库适配器:

development:
  #adapter: mysql
  adapter: mysql2
  database: somedatabase_development