6

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

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

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 上找到的 Windows 版本的 mysql2

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

4

2 回答 2

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,将 gem 锁定到 Gemfile 本身中的特定版本,然后运行包更新以强制重新评估 Gemfile,这将强制选择器。问题是 bundle 无法满足您的需求,因为它仅在使用 --deployment 标志时评估锁定文件。这意味着它无法重新评估它所在的平台。它严格按照锁定文件中的内容进行。这就是为什么唯一真正的解决方案是将您的 gem 版本锁定在主 Gemfile 中,然后捆绑更新以强制重新评估。

您可能会放弃 --deployment 并使用

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

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

于 2012-11-13T11:31:24.137 回答
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
于 2013-11-07T05:43:37.747 回答