RVMとrbenvが実際にどのように機能するかに興味があります。
明らかに、Rubyとgemsetの異なるバージョン間で交換しますが、これはどのように達成されますか?私は彼らが単にシンボリックリンクを更新していると思っていましたが、コードを掘り下げて(そしてBashの知識が表面的であることを認めなければなりません)、彼らはこれ以上のことをしているようです。
RVMとrbenvが実際にどのように機能するかに興味があります。
明らかに、Rubyとgemsetの異なるバージョン間で交換しますが、これはどのように達成されますか?私は彼らが単にシンボリックリンクを更新していると思っていましたが、コードを掘り下げて(そしてBashの知識が表面的であることを認めなければなりません)、彼らはこれ以上のことをしているようです。
簡単な説明: rbenv は、環境の にフックすることによって機能しますPATH
。コンセプトはシンプルですが、悪魔は細部に宿ります。以下の完全なスクープ。
まず、rbenv は、インストールされているすべてのバージョンの Ruby にわたって、すべてのコマンド ( 、、など) のshimを作成します。このプロセスは再ハッシュと呼ばれます。新しいバージョンの Ruby をインストールするか、コマンドを提供する gem をインストールするたびに、 を実行して、新しいコマンドがシミングされていることを確認します。ruby
irb
rake
gem
rbenv rehash
これらの shim は、単一のディレクトリ (~/.rbenv/shims
デフォルト) にあります。rbenv を使用するには、shims ディレクトリを の前に追加するだけですPATH
。
export PATH="$HOME/.rbenv/shims:$PATH"
次にruby
、コマンドラインから実行するか、シバンが読み取るスクリプトを実行すると#!/usr/bin/env ruby
、オペレーティングシステムが~/.rbenv/shims/ruby
最初にそれを見つけて、インストールした他のruby
実行可能ファイルの代わりに実行します。
各 shim は、順番に実行される小さな Bash スクリプトですrbenv exec
。したがって、パスに rbenv がある場合、irb
は と同等rbenv exec irb
であり、ruby -e "puts 42"
は と同等rbenv exec ruby -e "puts 42"
です。
このrbenv exec
コマンドは、使用する Ruby のバージョンを特定し、そのバージョンに対応するコマンドを実行します。方法は次のとおりです。
RBENV_VERSION
、その値によって使用する Ruby のバージョンが決まります。.rbenv-version
ファイルがある場合、その内容がRBENV_VERSION
環境変数の設定に使用されます。.rbenv-version
、rbenv は、.rbenv-version
ファイルシステムのルートに到達するまで、各親ディレクトリでファイルを検索します。見つかった場合は、その内容を使用してRBENV_VERSION
環境変数を設定します。RBENV_VERSION
、rbenv は~/.rbenv/version
ファイルの内容を使用して設定を試みます。rbenv local
(現在のディレクトリにファイルを作成するコマンドを使用して、プロジェクト固有の Ruby バージョンを設定でき.rbenv-version
ます。同様に、rbenv global
コマンドはファイルを変更し~/.rbenv/version
ます。)
環境変数で武装したRBENV_VERSION
rbenv は、~/.rbenv/versions/$RBENV_VERSION/bin
の先頭に追加し、 にPATH
渡されたコマンドと引数を実行しrbenv exec
ます。出来上がり!
内部で何が起こっているかを詳しく調べるにはRBENV_DEBUG=1
、Ruby コマンドを設定して実行してみてください。rbenv が実行するすべての Bash コマンドは、端末に書き込まれます。
現在、rbenv はバージョンの切り替えだけに関心がありますが、プラグインの繁栄しているエコシステムは、Ruby のインストールから環境のセットアップ、「gemset」の管理、さらには自動化bundle exec
まで、あらゆることを行うのに役立ちます。
IRC サポートが Ruby のバージョンの切り替えにどのような関係があるのかよくわかりませんが、rbenv はサポートを必要としないほどシンプルでわかりやすいように設計されています。しかし、助けが必要な場合は、数回クリックするだけで課題トラッカーと Twitter にアクセスできます。
開示: 私は rbenv、ruby-build、および rbenv-vars の作成者です。
詳細な記事を書きました: http://niczsoft.com/2011/11/what-you-should-know-about-rbenv-and-rvm/
基本的な違いは、シェル環境が変更される場所です。
また、RVM に関することは、Ruby を管理するだけでなく、他のツールよりも多くのことをカバーすることです (RVM と rbenv 以外にも他のツールがあります: https://twitter.com/#!/mpapis/状態/171714447910502401 )
Freenode サーバーの "#rvm" チャネルで IRC で得られるインスタント サポートを忘れないでください。
上記の優れた回答を要約すると、RVM と rbenv の主な実際の違いは、Ruby のバージョンが選択されるタイミングです。
rbenv:
rbenv は、Ruby と同じ名前のコマンドである shim をパスの先頭に追加します。コマンド ラインで入力ruby
すると、代わりに shim が実行されます (「ruby」とも呼ばれ、パスの最初に来るため)。shim は環境変数または.rbenv_version
ファイルを探して、デリゲートする Ruby のバージョンを伝えます。
RVM:
RVM では、 を呼び出すことで Ruby のバージョンを直接設定できますrvm use
。さらに、cd
システム コマンドもオーバーライドします。ファイルをcd
含むフォルダーに入ると、ファイル.rvmrc
内のコード.rvmrc
が実行されます。これは、Ruby のバージョンやその他の好きなものを設定するために使用できます。
その他の違い:
もちろん他にも違いがあります。RVM にはすぐに使用できる gemset がありますが、rbenv にはもう少しハッキングが必要です (ただしそれほど多くはありません)。どちらも問題に対する機能的な解決策です。