我正在将我们的一个Rails2.3.8应用程序升级到Rails3,在绑定器和部署方面遇到了一个恼人的问题。我在Windows机器上开发应用程序,但生产环境运行的是Ubuntu Linux。现在,我的问题是bundler忽略了生产环境中的mysqlgem,乘客会说:“!!!缺少mysql gem。将它添加到gem文件:gem’mysql’,2.8.1′
这是我的Gemfile:
编辑此文件以绑定应用程序的依赖项。
#此序言是Rails 3应用程序的当前序言;根据需要编辑。
来源’http://rubygems.org’
gem“rails”、“3.0.0”
gem’net ldap’,:require=>;’net/ldap’
gem’highline’,:require=>;’高端/进口’
gem’mysql’,’2.8.1′
gem’net ssh’,:require=>;’net/ssh’
#为当地环境捆绑宝石。确保
#将仅测试宝石放入该组中,使其生成器
#在开发模式下,rake任务可用:
小组:开发,:测试
gem’fakeweb’,:require=>;’假网络
gem’flexmock’,:require=>;’flexmock/测试单元’
终止
如您所见,指定了mysqlgem。但是,在部署时,bundler会忽略它。为什么?原因是Bundler生成以下Gemfile.lock(仅包含相关部分):
。。。。
mime类型(1.16)
mysql(2.8.1-x86-mingw32)
net ldap(0.1.1)
....
请注意,它包括特定于平台的gem。这显然不是我想要它做的,因为当在Linux下运行时,gem不适合(而且似乎被忽略)
那么,Bundler有没有办法解决这些问题?或者每次在我的开发机器上运行bundle install时,我必须记住在生成的Gemfile.lock中手动更改mysql gem版本吗
提前谢谢你
更新
bundler团队似乎意识到了这个问题
这是Bundler中的一个已知问题。解决办法是:
- 在与您的生产环境非常相似的系统上生成Gemfile.lock,以获得与您的生产平台相匹配的结果。实际上,这意味着如果您的生产系统是Windows,则只能在Windows上生成Gemfile.lock文件
- 根本不提交Gemfile.lock文件,并在部署时确定对生产计算机的依赖关系(
捆绑安装,而不提交--部署)。虽然一般不推荐,但在修复错误之前,这是一种常用的解决方法。例如,这是Heroku推荐的解决方案 - 切换到JRuby,它在Windows和Linux上都具有相同的平台字符串(
java)。我并不认真地建议这样做,但我相信它会解决问题 - 修复Bundler源代码中的问题,即帮助Bundler团队修复错误。:)