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