在本文中,我將比較Mac上最流行的Ruby版本管理器:Chruby、Rbenv、RVM,以及多語言版本管理器Asdf,還有全新用Rust編寫的版本管理器Frum。我將根據您的需求最可能需要的情況來提供推薦。
預裝Ruby不適合開發者
剛接觸Ruby的人很高興發現macOS已預裝了Ruby。當更有經驗的開發者告訴他們:“不要使用Mac系統的Ruby”時,他們常常感到失望。我在其他地方已經寫過原因。簡而言之,系統Ruby是為macOS而非您服務的。它適合運行實用腳本,但對於開發來說,系統Ruby已過時,如果不小心,安裝gems可能會導致頭痛(包括系統安全違規)。
Homebrew的單一Ruby問題
Homebrew是添加開發者軟件到macOS的包管理器,已成為近標準。Homebrew使得安裝新Ruby版本以避免依賴系統Ruby變得容易。但Homebrew有兩個問題。首先,Homebrew的Ruby版本可能在安裝其他Homebrew包時自動且意外地被新版本替換(通過brew pin ruby
解決此問題)。更重要的是,Homebrew只允許您安裝一個版本的Ruby。如果您在Ruby中開發或維護多個項目,您可能需要切換Ruby版本。這時您就需要版本管理器了。
Asdf for Multiple Languages
Asdf 是一個支援多種語言的版本管理工具。如果你使用 Ruby 開發 Rails 6 網路應用程式,你需要安裝 Node 和 Yarn 來建立一個 Rails 初始應用程式。(Rails 7 可能會消除對 Node 的需求,但目前這一點尚未確定。)
因此,對於 Rails 開發者來說,Asdf 是一個理想的版本管理器。如果你開發 Python、Elixir 或許多其他語言的應用程式,它也將非常適合你(查看支援的語言列表)。使用 Asdf 有什麼缺點嗎?主要有兩點。它使用shim來攔截常用命令,這可能會使故障排除變得困難。此外,某些操作可能會有點慢。如果你正在開發多種語言,我建議你嘗試 Asdf,看看是否喜歡它。如果你發現 Asdf 拖慢了你的速度,可以轉向 Frum,這是一個用 Rust 編寫的僅限 Ruby 的版本管理器。
僅限 Ruby 的版本管理器
如果你只打算使用 Ruby 開發應用程式,可以從四個僅限 Ruby 的版本管理器中選擇:Chruby、Frum、Rbenv 和 RVM。這四者的差異在於速度、複雜性以及切換 Ruby 版本的方式。讓我們先來看看最古老的:RVM。
RVM
RVM 是 Ruby 的首個廣泛流行的版本管理器,至今仍被維護且廣泛使用。RVM 修改了系統的 cd
命令,當你切換目錄時會設置環境變量。為了覆蓋 cd
命令,RVM 安裝腳本會更改 shell 配置文件(在新款 Mac 上是 ~/.zshrc
文件)。
RVM 能正確顯示環境變量,揭示 Ruby 和 gem 的版本及位置,這有助於診斷問題。然而,RVM 包含如 gemsets 等額外功能。由於 Bundler 已加入核心 Ruby 來管理 gem 依賴,gemsets 已不再必需。這額外的複雜性並非必要,因此許多開發者已轉向使用如 Rbenv、Chruby 或 Frum 等較新的版本管理器。
Rbenv
與 RVM 並列,Rbenv 長久以來一直是 Ruby 最受歡迎的版本管理器之一。Rbenv 使用 shims 來攔截常見的 Ruby 命令。(Asdf 也使用 shims。)
安裝 Rbenv 後,你必須修改你的 ~/.zshrc
文件,以使 Rbenv 的 shims 優先於普通 Ruby 命令。shim 會調用 rbenv exec
命令,該命令在運行任何 Ruby 命令前確定使用哪個版本的 Ruby。
墊片有兩個缺點。首先,墊片通過隱藏實際命令使得故障排除更加困難。例如,which ruby
命令顯示的是Rbenv墊片,而非實際的Ruby版本(若想看到實際的Ruby命令,需設置RBENV_DEBUG
環境變數)。其次,墊片可能會在執行Ruby命令時增加微秒級的延遲。(與RVM不同,Rbenv每次運行Ruby命令時都會介入,而非僅在更改目錄時介入。)對於注意到延遲或不喜歡墊片概念的開發者,可以選擇Chruby或Frum。
Chruby
Chruby不如RVM或Rbenv那樣廣為人知,但受到幾位知名Ruby開發者的推崇。與RVM不同,它不會覆蓋cd
命令。與Rbenv或Asdf不同,它不會通過墊片攔截命令。您需要修改~/.zshrc
文件,以便Chruby在本地shell環境中運行。無需修改$PATH
,Chruby會根據您選擇的Ruby版本自動處理。
Chruby還會為Ruby設置特定的環境變數。這就是Chruby在不同Ruby版本間切換所需的全部操作。它與which
命令配合故障排除效果良好。我使用Chruby多年,未遇到任何問題。Chruby是個絕佳選擇,但您可能也想試試最新的Ruby版本管理器Frum。
Frum
Frum 是用 Rust 編寫的,Rust 是一種適合快速執行系統軟件命令行操作的良好語言。Frum 是新推出的(2021年初發布)。與 Asdf、Chruby 或 Rbenv 不同,它內置了 Ruby 安裝命令,因此無需額外的程序來安裝 Ruby。安裝程序速度快,且 Frum 無需依賴任何外部工具(它是一個可以通過 Homebrew 安裝的一體化 Rust 可執行文件)。
安裝 Frum 後,您必須修改 ~/.zshrc
文件,以便 Frum 能在您的本地 shell 環境中運行。與其他版本管理器類似,它會檢查項目目錄中的 .ruby-version
文件,如果某個項目未指定版本,則默認使用全局 Ruby 版本。它不使用 shim(不像 Asdf 或 Rbenv),也不會覆蓋 cd
命令(不像 RVM)。雖然它是新出的,但我推薦使用,因為它是一體化的且速度快。
安裝 Ruby 的版本管理器
I’ve written a complete guide to installing Ruby on Mac. In the guide, I provide instructions for:
如果您想了解 RVM 或 Rbenv,請參閱:
A Note about Docker
若提及Ruby版本管理器,可能有人會說:“我用Docker。”Docker是一種容器化工具,部分開發者用於版本管理。Docker主要用於創建可重現的虛擬服務器,其中包含運行應用程序所需配置的任何軟件依賴版本(語言、數據庫、消息隊列)。因此,它非常適合創建部署到服務器的“凍結”開發環境版本。
你也可以在容器內本地開發,但這會運行得更慢,需要更多內存,並增加配置的複雜性,相比版本管理器。為了保持簡單,除非應用程序異常複雜,否則我避免在本地開發中使用Docker。
結論
如果你正在使用Ruby進行多個項目的工作,那麼你不僅僅是一個隨意的Ruby用戶。確保在你的本地開發環境中安裝一個優秀的版本管理器。
I like Asdf because I develop in Ruby and JavaScript and Asdf gives me one version manager for both languages. However, Asdf uses shims (like Rbenv) so occasionally it’s slower than I like. I also find it annoying that Asdf hides the actual command from troubleshooting with the which
command. If these drawbacks outweigh the convenience of managing multiple languages, I recommend using Frum to switch among your Ruby versions. Version managers should be simple and stay out of your way when you’re working.
MacOS上關於Ruby版本管理器的常見問題(FAQs)
RVM和rbenv之間的主要區別是什麼?
RVM(Ruby Version Manager)和rbenv都是用於管理系統上多個Ruby版本的工具。兩者的主要區別在於它們的方法。RVM功能更豐富,允許你管理gemsets —— 一組用於特定Ruby應用程式的gems。相比之下,rbenv更簡單,僅專注於切換Ruby版本。它不支援gemsets,但你可以使用名為ruby-build的外掛來實現類似功能。
如何使用RVM安裝特定版本的Ruby?
要使用RVM安裝特定版本的Ruby,你可以使用‘rvm install’命令,後跟版本號。例如,要安裝Ruby 2.6.3,你將使用命令‘rvm install 2.6.3’。安裝後,你可以使用‘rvm use’命令切換到此版本,例如‘rvm use 2.6.3’。
我可以在同一系統上同時使用RVM和rbenv嗎?
雖然技術上可以在同一系統上安裝RVM和rbenv,但通常不建議這樣做。兩種工具都會修改你的shell環境,同時使用可能導致不可預期的行為。最好根據你的需求選擇一個並堅持使用。
如何使用rbenv卸載Ruby版本?
要使用rbenv卸載Ruby版本,你可以使用‘rbenv uninstall’命令,後跟版本號。例如,要卸載Ruby 2.6.3,你將使用命令‘rbenv uninstall 2.6.3’。
如何使用RVM設置默認的Ruby版本?
要使用RVM設定默認的Ruby版本,您可以使用’rvm –default use’命令,後跟版本號。例如,要將Ruby 2.6.3設置為默認版本,您將使用命令’rvm –default use 2.6.3’。
如何更新rbenv及其插件?
要更新rbenv及其插件,您可以使用git。在終端中導航到rbenv目錄(通常是’~/.rbenv’)並運行’git pull’。然後,導航到每個插件目錄並執行相同的操作。
我可以在其他編程語言中使用RVM或rbenv嗎?
RVM和rbenv專門設計用於管理Ruby版本。如果您需要管理其他編程語言的版本,您可能需要查看像pyenv(用於Python)或nvm(用於Node.js)這樣的工具。
如何使用rbenv列出所有已安裝的Ruby版本?
要使用rbenv列出所有已安裝的Ruby版本,您可以使用’rbenv versions’命令。這將顯示rbenv可使用的所有Ruby版本的列表。
如何使用RVM處理gem依賴?
RVM允許您通過使用gemsets來管理gem依賴。您可以使用’rvm gemset create’命令創建一個gemset,使用’rvm gemset use’命令切換到它,然後根據需要安裝gems。
如何使用rbenv安裝新的Ruby版本?
要使用rbenv安裝新的Ruby版本,您可以使用’rbenv install’命令,後跟版本號。例如,要安裝Ruby 2.6.3,您將使用命令’rbenv install 2.6.3’。
Source:
https://www.sitepoint.com/ruby-version-managers-macos/