这似乎应该是显而易见的,但我一直无法找到一种方法来做到这一点。
我的基本问题是:我在 Scientific Linux 6 系统(来自基本存储库)上安装了 Ruby 1.8.7。我正在尝试通过 安装一些 gem gem install
,但我遇到了很多需要 ruby 1.9 或更高版本的 gem。
我可以通过参数指定单个 gem 版本-v
,但gem install
似乎总是选择可用于任何 gem 依赖项的最高版本,所以即使我限制了我想要的 gem 的版本,我的安装仍然会失败,因为其中一个依赖项将需要 Ruby 1.9。我想要的一些 gem 的依赖树很深很宽;手动找出我需要的每个依赖项的哪个版本,然后手动安装每个所需的 gem,然后才能按照自己的方式工作,这将花费大量时间。(这就是依赖管理应该解决的问题。)
那么:有没有办法告诉 Ruby,“安装 gem foo,只使用可以与当前安装的 Ruby 版本一起使用的 gem”?(甚至,“安装gem foo的xyz版本,仅使用可与当前安装的 Ruby 版本一起使用的 gem”?)
正如我所提到的,我碰巧在 Scientific Linux 6 上运行 Ruby 1.8.7,但我怀疑任何解决方案都将是特定于平台的。
使用捆绑器
没有“简单”的方法可以做到这一点,但一种实用的选择是使用Bundler来管理您的 gem。Github 上的一条评论建议在您选择的 Ruby 上创建一个具有严格版本要求的 gem,然后让 Bundler 处理剩余的依赖项。
我不确定这是否适用于所有情况。某些 gem,尤其是较旧的 gem,可能没有指定可选的required_ruby_version,因此可能仍被解析为可安装的。但是,当您遇到此类 gem 时,您可以使用 Bundler 的版本约束表示法手动将所需的版本固定在 Gemfile 中。
不要将系统红宝石用于您自己的程序。它的目的是为用 Ruby 编写的系统应用程序提供服务,并且它仅由 Red Hat 支持这些应用程序。
相反,请使用 Ruby 版本管理器,例如 rvm 或 rbenv,您可以使用它运行当前的 Ruby 版本以及您自己的程序可能需要的任何 gem。
如果您需要供应商支持,您还可以使用 Red Hat Software Collections 中的 Ruby 版本。