我正在将我们的一款Rails 2.3.8应用升级到Rails 3,但在绑定器和部署方面遇到了一个恼人的问题.我在Windows机器上开发应用程序,但生产环境运行的是Ubuntu Linux.现在,我的问题是bundler忽略了生产环境中的mysql颗Ruby ,乘客吐出:"!!! Missing the mysql gem. Add it to your Gemfile: gem 'mysql', '2.8.1'"

这是我的Gemfile:

# Edit this Gemfile to bundle your application's dependencies.
# This preamble is the current preamble for Rails 3 apps; edit as needed.
source 'http://rubygems.org'

gem 'rails', '3.0.0'
gem 'net-ldap', :require => 'net/ldap'
gem 'highline', :require => 'highline/import'
gem 'mysql', '2.8.1'
gem 'net-ssh', :require => 'net/ssh'

# Bundle gems for the local environment. Make sure to
# put test-only gems in this group so their generators
# and rake tasks are available in development mode:
group :development, :test do
  gem 'fakeweb', :require => 'fakeweb'
  gem 'flexmock', :require => 'flexmock/test_unit'
end

如你所见,mysql颗Ruby 是指定的.然而,在部署时,bundler会忽略它.为什么?原因是Bundler生成以下Gemfile.lock(仅包含相关部分):

....
mime-types (1.16)
mysql (2.8.1-x86-mingw32)
net-ldap (0.1.1)
....

请注意,它包括特定于平台的gem.这显然不是我想要它做的,因为当在Linux下运行时,gem不适合(而且似乎被忽略).

那么,Bundler有没有办法解决这些问题?还是每次在开发机器上运行bundle install时,我都必须记住手动更改生成的Gemfile.lock中的mysql gem版本?

提前谢谢!

Update

bundler团队似乎意识到了这一点.

推荐答案

这是known issue in Bundler美元.解决办法是:

  • 生成一个文件.锁定与生产环境足够相似的系统,以获得与生产平台匹配的结果.实际上,这意味着您只能生成文件.如果生产系统是Windows,则在Windows上锁定文件.
  • 不要提交文件.完全锁定文件,并在部署时确定对生产机器的依赖关系(bundle install而不是--deploy).虽然一般不推荐,但在修复错误之前,这是一种常用的解决方法.例如,这是Heroku推荐的解决方案.
  • 切换到JRuby,它在Windows和Linux(java)上都有相同的平台字符串.我不太推荐这样做,但我相信它会解决问题.
  • 修复Bundler源代码中的问题,即帮助Bundler团队修复错误.:)

Ruby-on-rails相关问答推荐

如何在嵌套路由中使用Ruby on rails多态关联

Rails Heroku部署:预编译assets资源 失败.SassC::语法错误

发送不调用类或模块中的私有方法

API Rails 路由,令牌是路由的一部分

Ruby on Rails 让外键工作

Rails 7 - has_many_attached 在加载新附件时删除旧附件

GroupingError:错误:列必须出现在 GROUP BY 子句中或在聚合函数中使用

如何使用 Vim 插入 ERB 标签?

有没有办法在模型而不是视图中使用复数()?

DateTime.now 还是 Time.now?

是否有与 PHP 的 isset() 等效的 Rails?

通过字符串获取 ActiveRecord 对象的属性

Ruby on Rails 错误无法加载此类文件 - 更少

Rails,设计认证,CSRF 问题

如何使用 Rspec 判断 ActiveJob 中排队的内容

反编译开发assets资源 管道

让 bundler 为不同的平台使用不同的 gem

默认情况下 haml

Rails:如何将日期时间字符串解析为特定时区

警告:运行 ruby​​ 或 gem 命令时不安全的世界可写目录