ruby on rails - 安裝ruby - RVM和rbenv如何工作?




rvm安裝 (4)

主要的區別似乎是http://niczsoft.com/2011/11/what-you-should-know-about-rbenv-and-rvm/ 。 Ruby被切換:

  • 對於RVM手動(rvm使用)或在更改目錄期間自動執行
  • 對於rbenv,每次執行ruby命令時都會自動執行

RVM依靠修改的cd命令和rvm use手動選擇Ruby。 rbenv為所有基本的ruby命令使用包裝或“填充”作為選擇ruby的默認機制。 RVM為gem,rake,ruby等基本命令行工具創建了包裝器。 它們用於CronJobs(請參閱http://rvm.io/integration/cron/ ),但它們不是切換Ruby版本的默認機制。

因此,這兩種方法都通過覆蓋命令並使用包裝器來“自動”選擇正確的Ruby版本。 rvm覆蓋shell命令,如cd。 rbenv覆蓋所有基本的ruby命令,例如ruby,irb,rake和gem。

我對RVM和rbenv如何工作感興趣。

很顯然,他們在不同版本的Ruby和gemsets之間進行了切換,但這是如何實現的呢? 我曾假設他們只是更新符號鏈接,但已經深入研究代碼(我必須承認我對Bash的知識是膚淺的),但他們似乎做的不僅僅是這些。


我寫了一篇深入的文章: http://niczsoft.com/2011/11/what-you-should-know-about-rbenv-and-rvm/ : http://niczsoft.com/2011/11/what-you-should-know-about-rbenv-and-rvm/

基本的區別在於shell環境的改變:

  • RVM:在更改Ruby時發生了改變。
  • rbenv:它在運行Ruby / gem可執行文件時發生了改變。

另外,關於RVM的一點是,它涵蓋了很多,然後只是管理Rubies,它比其他任何工具都多(除RVM和rbenv之外還有其他一些工具: https://twitter.com/#!/mpapis/status/171714447910502401 ://twitter.com/#! https://twitter.com/#!/mpapis/status/171714447910502401 mpapis https://twitter.com/#!/mpapis/status/171714447910502401

不要忘記在Freenode服務器的“#rvm”頻道上獲得對IRC的即時支持。


簡短的解釋:rbenv通過連接到你的環境的PATH 。 這個概念很簡單,但魔鬼在細節中; 下面全是勺子。

首先,rbenv為所有安裝的Ruby版本創建所有命令( rubyirbrakegem等)的填充。 這個過程被稱為rehashing 。 每次安裝新版本的Ruby或安裝提供命令的gem時,都可以運行rbenv rehash以確保任何新命令都被刷新。

這些墊片位於一個目錄中(默認情況下~/.rbenv/shims )。 要使用rbenv,只需將shims目錄添加到PATH的前面:

export PATH="$HOME/.rbenv/shims:$PATH"

然後,每當從命令行運行ruby ,或者運行一個腳本,其腳本讀取#!/usr/bin/env ruby ,操作系統將首先找到~/.rbenv/shims/ruby並運行它而不是任何其他的ruby您可能已安裝的可執行文件

每個墊片都是一個很小的Bash腳本,它反過來運行rbenv exec 。 所以在你的路徑中使用rbenv時, irb相當於rbenv exec irb ,而ruby -e "puts 42"相當於rbenv exec ruby -e "puts 42"

rbenv exec命令會指出您要使用的Ruby版本,然後為該版本運行相應的命令。 就是這樣:

  1. 如果設置了RBENV_VERSION環境變量,則其值將確定要使用的Ruby版本。
  2. 如果當前工作目錄具有.rbenv-version文件,則其內容用於設置RBENV_VERSION環境變量。
  3. 如果當前目錄中沒有.rbenv-version文件,則rbenv會在每個父目錄中搜索.rbenv-version文件,直到它到達文件系統的根目錄。 如果找到一個,則其內容用於設置RBENV_VERSION環境變量。
  4. 如果RBENV_VERSION仍未設置,rbenv會嘗試使用~/.rbenv/version文件的內容進行設置。
  5. 如果沒有在任何地方指定版本,rbenv會假定您想要使用“系統”Ruby - 即,如果rbenv不在您的路徑中,將運行任何版本。

(您可以使用rbenv local命令設置項目特定的Ruby版本,該命令將在當前目錄中創建.rbenv-version文件。同樣, rbenv global命令rbenv global修改~/.rbenv/version文件。)

使用RBENV_VERSION環境變量,rbenv將~/.rbenv/versions/$RBENV_VERSION/binPATH的前面,然後執行傳遞給rbenv exec的命令和參數。 瞧!

要徹底了解RBENV_DEBUG=1發生了什麼,請嘗試設置RBENV_DEBUG=1並運行Ruby命令。 rbenv運行的每個Bash命令都將被寫入您的終端。

現在,rbenv只關注切換版本,但繁榮的插件生態系統將幫助您完成從安裝Ruby設置環境管理“gemsets”甚至自動bundle exec

我不太清楚IRC支持與切換Ruby版本有什麼關係,rbenv的設計簡單易懂,不需要支持。 但是,如果您需要幫助,問題跟踪器和Twitter只需幾次點擊即可。

披露:我是rbenv,ruby-build和rbenv-vars的作者。


rvm system
env > before
rvm jruby # or whatever
env > after
diff after before

大致給你提供:

< GEM_HOME=$HOME/.gem/ruby/1.9.1
---
> GEM_HOME=$HOME/.rvm/gems/jruby-1.6.6
< GEM_PATH=$HOME/.gem/ruby/1.9.1
---
> GEM_PATH=$HOME/.rvm/gems/jruby-1.6.6:$HOME/.rvm/gems/[email protected]
*bunch of rvm_*
> MY_RUBY_HOME=$HOME/.rvm/rubies/jruby-1.6.6
> RUBY_VERSION=jruby-1.6.6
> IRBRC=$HOME/.rvm/rubies/jruby-1.6.6/.irbrc

它預先說明:

$HOME/.rvm/gems/jruby-1.6.6/bin:$HOME/.rvm/gems/[email protected]/bin

$PATH





rbenv