在Windows和Linux环境中共享Gemfile.lock

Rya*_*yan 6 rubygems ruby-on-rails bundler

我被告知不要忘记Gemfile.lock,但是我遇到了问题.

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

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

  PLATFORMS
    x86-mingw32
Run Code Online (Sandbox Code Playgroud)

我使用Capistrano进行部署,我收到此错误:

请安装mysql适配器:gem install activerecord-mysql-adapter(mysql不是bundle的一部分.将它添加到Gemfile.)

即使我的gemfile是这样的:

...
gem 'mysql2'
...
Run Code Online (Sandbox Code Playgroud)

我认为那是因为Rails尝试使用Gemfile.lock上的mysql2的windows版本

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

ddd*_*ddd 6

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

  
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)都无法使用.

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

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

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

如果你要在一个完全不同于你正在部署的平台上进行开发,这是必要的,因为所引用的是捆绑器的工作方式.上面的命令应该完全复制--deployment所做的事情.所有这些都将记录在.bundle/config中.