防止 Bundler 在 Ruby 版本命名空间下安装 gem

Preventing Bundler to install gems under the Ruby version namespace

当我使用 Bundler 安装 gems 到项目目录时,出于某种原因,它将它们安装在 Ruby 版本命名空间下,即 vendor/bundle/ruby/2.1.0.

为什么Bundler会有这样的行为?有什么方法可以防止 Bundler 在 Ruby 版本命名空间下安装 gem,而是将它们直接放入 vendor/bundle?

Bundler 这样做的原因与 rubygems 这样做的原因相同——不同的 Ruby 发行版可能没有兼容的 gems。例如,带有针对 1.9.3 的 ruby.h 构建的 C 扩展的 gem 在 2.1.0 下无法工作,运行 在 JRuby 下也不会工作。纯 Ruby gems 应该可以工作,但是纯 Ruby gems 和 gems 在 Ruby 中具有原生扩展之间没有区别gems 或 Bundler,因此系统行为保守。此外,一些 gem 在其 gem 规范中指定 required_ruby_version,这将它们锁定到特定的 Ruby 版本;支持此类功能需要命名空间。

虽然您可能会通过 monkeypatch 来获得您想要的行为,但这不是很可取,因为针对错误的 Ruby 版本的 C 扩展 运行 可能会导致您的过程段错误。