Ruby

是否有一種簡單的方法可以為目前安裝的 Ruby 版本安裝 Ruby gem?

  • October 22, 2016

這似乎應該是顯而易見的,但我一直無法找到一種方法來做到這一點。

我的基本問題是:我在 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,但我懷疑任何解決方案都將是特定於平台的。

不要將系統紅寶石用於您自己的程序。它的目的是為用 Ruby 編寫的系統應用程序提供服務,並且它僅由 Red Hat 支持這些應用程序。

相反,請使用 Ruby 版本管理器,例如 rvm 或 rbenv,您可以使用它執行目前的 Ruby 版本以及您自己的程序可能需要的任何 gem。

如果您需要供應商支持,您還可以使用 Red Hat Software Collections 中的 Ruby 版本。

使用捆綁器

沒有“簡單”的方法可以做到這一點,但一種實用的選擇是使用Bundler來管理您的 gem。Github 上的一條評論建議在您選擇的 Ruby 上創建一個具有嚴格版本要求的 gem,然後讓 Bundler 處理剩餘的依賴項。

我不確定這是否適用於所有情況。某些 gem,尤其是較舊的 gem,可能沒有指定可選的required_ruby_version,因此可能仍被解析為可安裝的。但是,當您遇到此類 gem 時,您可以使用 Bundler 的版本約束表示法手動將所需的版本固定在 Gemfile 中。

引用自:https://serverfault.com/questions/805377