2012-11-13 82 views
6

我已经建议不要试图解开Gemfile.lock,但是我遇到了问题。在Windows和Linux环境下共享Gemfile.lock

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

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

    PLATFORMS 
    x86-mingw32 

我使用Capistrano的部署,我得到这个错误:

请安装MySQL适配器:安装了activerecord-mysql的适配器(mysql的不是包的一部分将它添加到的Gemfile 。)

即使我的Gemfile是这样的:

... 
gem 'mysql2' 
... 

我认为这是由于Rails试图使用Windows的版本O f mysql2这是发现Gemfile.lock

任何想法来解决这个问题?

回答

6

添加类似以下内容到你的Gemfile中,然后捆绑更新 (替换当前的mysql2宝石显然上市)

 
    
if RUBY_PLATFORM =~ /win32/ 
    gem "mysql2", :platform => [:mswin, :mingw] 
else 
    gem "mysql2", :platform => :ruby 
end 
 

这意味着,如果平台“的win32”(Windows)中,然后安装windows版本,否则安装所有Unix系统的'ruby'正常版本。至少我不知道任何Unix系统(从Mac OS X,Linux,Solaris到* BSD),这是行不通的。

更新:了解了更多信息。问题是 - 部署标记只有看着锁定文件。否则,你可以放弃 - 部署,将gem锁定在Gemfile本身的一个特定版本中,然后运行一个包更新来强制Gemfile被重新评估,这将强制选择器。问题是该软件包不能满足你想要的,因为它仅在使用--deployment标志时评估锁定文件。这意味着它无法重新评估其平台。通过锁文件中的内容严格执行严格。这就是为什么唯一真正的解决方案是将Gem版本锁定在主Gemfile中,然后捆绑更新以强制重新评估。

你也许可以放弃--deployment,只是使用

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

这是必要的,如果你要在一个完全不同的平台比你由于部署上,有待开发,如引用,捆绑器的工作方式。上述命令应该复制 - 部署的确切内容。所有这些都将被记录在.bundle/config中。

+0

感谢您的信息!有没有一种方法可以禁用'--deployment',同时仍然使用'bundler/capistrano'中的帮助程序 – Ryan

+0

我不能告诉你。我个人不使用卡皮斯特拉诺。 – ddd

+0

谢谢,我知道了与上面的行:) – Ryan

1

您可以通过在Windows上的命令提示符处输入此内容来检查RUBY_PLATFORM。

ruby -e 'puts RUBY_PLATFORM' 

例如,这Gemfile文件可以在我的Windows笔记本电脑和Linux服务器共享。

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