【发布时间】:2015-03-03 04:50:03
【问题描述】:
当我使用 Bundler 将 gems 安装到项目目录时,出于某种原因,它将它们安装在 Ruby 版本命名空间下,即vendor/bundle/ruby/2.1.0。
为什么 Bundler 会有这样的行为?有什么办法可以阻止 Bundler 在 Ruby 版本命名空间下安装 gem,而是直接将它们放入 vendor/bundle?
【问题讨论】:
当我使用 Bundler 将 gems 安装到项目目录时,出于某种原因,它将它们安装在 Ruby 版本命名空间下,即vendor/bundle/ruby/2.1.0。
为什么 Bundler 会有这样的行为?有什么办法可以阻止 Bundler 在 Ruby 版本命名空间下安装 gem,而是直接将它们放入 vendor/bundle?
【问题讨论】:
Bundler 这样做的原因与 rubygems 这样做的原因相同 - 不同的 Ruby 发行版可能没有兼容的 gem。例如,针对 1.9.3 的 ruby.h 构建的带有 C 扩展的 gem 不能在 2.1.0 下运行,也不能在 JRuby 下运行。纯 Ruby gem 应该可以工作,但是纯 Ruby gem 和在 Rubygems 或 Bundler 中具有本机扩展的 gem 之间没有区别,因此系统表现得比较保守。此外,一些 gem 在其 gemspecs 中指定 required_ruby_version,这会将它们锁定到特定的 Ruby 版本或多个版本;支持这种功能需要命名空间。
虽然您可能会修补一些东西以获得您想要的行为,但这并不是非常可取的,因为针对错误 Ruby 版本运行的 C 扩展可能会导致您的进程出现段错误。
【讨论】: