我被告知不要忘记Gemfile.lock,但是我遇到了问题。
我在我的Windows机器上开发,并推送到linux(ubuntu)服务器,问题是Bundler通过在版本号之后添加:x86-mingw32
来锁定某些宝石的Windows版本,这会导致问题。< / p>
GEM
remote: http://rubygems.org/
specs:
actionmailer (3.2.1)
...
mysql2 (0.3.11-x86-mingw32)
...
PLATFORMS
x86-mingw32
我使用Capistrano进行部署,我收到此错误:
请安装mysql适配器:gem install activerecord-mysql-adapter(mysql不是捆绑包的一部分。将其添加到Gemfile。)
即使我的gemfile是这样的:
...
gem 'mysql2'
...
我认为这是因为Rails尝试使用在Gemfile.lock上找到的mysql2的windows版本
有什么想法可以解决这个问题吗?
答案 0 :(得分: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 flag only 查看锁定文件。否则你可以放弃--deployment,将你的gems锁定到Gemfile本身的特定版本,然后运行bundle更新以强制重新评估Gemfile,这会强制选择器。问题是bundle不能满足您的需要因为它只在使用--deployment标志时评估锁定文件。这意味着它无法重新评估其所在的平台。它通过锁定文件中的内容严格。这就是为什么唯一真正的解决方案是将gem版本锁定在主Gemfile中,然后捆绑更新以强制重新评估。
您可以放弃--demployment并使用
bundle update && bundle install --without=development,test,any_other_groups --path=./vendor/bundle
如果你要在一个完全不同于你正在部署的平台上进行开发,这是必要的,因为所引用的是捆绑器的工作方式。上面的命令应该完全复制--deployment所做的事情。所有这些都将记录在.bundle / config中。
答案 1 :(得分:1)
您可以在Windows上的命令提示符处键入此内容来检查RUBY_PLATFORM。
ruby -e 'puts RUBY_PLATFORM'
例如,可以在我的Windows笔记本电脑和Linux服务器上共享此Gemfile。
if RUBY_PLATFORM =~ /(win32)|(i386-mingw32)/
gem 'mongrel','1.2.0.pre2'
else
gem 'unicorn'
end
答案 2 :(得分:0)
这是bundler know issue。你会发现一些解决方法就是这个链接。