Ruby on rails 在windows和linux环境中共享Gemfile.lock

Ruby on rails 在windows和linux环境中共享Gemfile.lock,ruby-on-rails,rubygems,bundler,Ruby On Rails,Rubygems,Bundler,有人建议我不要取消跟踪Gemfile.lock,但我遇到了问题 我在我的windows机器上开发,并推到linux(ubuntu)服务器上,问题是Bundler通过在版本号后添加:x86-mingw32来锁定一些gems的windows版本,这会导致问题 GEM remote: http://rubygems.org/ specs: actionmailer (3.2.1) ... mysql2 (0.3.11-x86-mingw32) ... PL

有人建议我不要取消跟踪Gemfile.lock,但我遇到了问题

我在我的windows机器上开发,并推到linux(ubuntu)服务器上,问题是Bundler通过在版本号后添加:
x86-mingw32
来锁定一些gems的windows版本,这会导致问题

GEM
  remote: http://rubygems.org/
  specs:
    actionmailer (3.2.1)
    ...
    mysql2 (0.3.11-x86-mingw32)
    ...

  PLATFORMS
    x86-mingw32
我使用Capistrano进行部署,出现以下错误:

请安装mysql适配器:gem安装activerecord mysql适配器(mysql不是捆绑包的一部分。请将其添加到Gemfile。)

即使我的文件如下所示:

...
gem 'mysql2'
...
我认为这是因为Rails试图使用Gemfile.lock上的mysql2的windows版本


有什么办法可以解决这个问题吗?

在您的GEM文件中添加如下内容,然后捆绑更新 (替换您当前的mysql2 gem列表)

这意味着,如果平台是“win32”(Windows),则安装Windows版本,否则安装适用于所有Unix系统的“ruby”普通版本。至少我不知道任何Unix系统(从MacOSX到Linux,到Solaris,再到*BSD)不能在上面工作

更新:获得了更多的信息。问题是--deployment标志只查看锁文件。否则,您可以放弃--deployment,将gems锁定到Gemfile本身的特定版本,然后运行bundle更新以强制重新评估Gemfile,这将强制选择器。问题是bundle不能满足您的需要,因为它在使用--deployment标志时只计算锁文件。这意味着它无法重新评估它的平台。它严格按照锁文件中的内容执行。这就是为什么唯一真正的解决方案是将gem版本锁定在主gem文件中,然后捆绑更新以强制重新评估

您可能会放弃部署,只使用


    bundle update && bundle install --without=development,test,any_other_groups --path=./vendor/bundle
  

如果由于bundler的工作方式,您将在一个完全不同于您正在部署的平台上进行开发,那么这是必要的。上面的命令应该完全复制--deployment的功能。所有这些都将记录在.bundle/config中。

您可以在Windows上的命令提示符下键入这些内容来检查RUBY_平台

ruby -e 'puts RUBY_PLATFORM'
例如,此文件可以在我的Windows笔记本电脑和Linux服务器上共享

if RUBY_PLATFORM =~ /(win32)|(i386-mingw32)/
  gem 'mongrel','1.2.0.pre2'
else
  gem 'unicorn'
end

谢谢你的信息!是否有一种方法可以禁用
--deployment
,同时仍然使用
bundler/capistrano
中的帮助程序,我无法告诉您。我个人不使用capistrano。谢谢,我是用上面的一句话弄明白的:)这看起来很有希望,我一到家我就试试,如果有用的话,你是个救生员!
if RUBY_PLATFORM =~ /(win32)|(i386-mingw32)/
  gem 'mongrel','1.2.0.pre2'
else
  gem 'unicorn'
end