どのように動作するか
rbenvは高階層の処理で、PATH
に注入された楔(shim)となる実行ファイルを使用して、Rubyコマンドを奪い取り、
アプリケーション固有のRubyのバージョンを決定し、適切なRuby一式に沿ったコマンドを渡します。
PATHの理解
ruby
またはrake
のようなコマンドを実行する際に、
OSはその名前の実行可能ファイルを見つけるためにディレクトリの一覧を通して検索を行います。
このディレクトリの一覧は、PATH
と呼ばれる環境変数に定義され、
一覧の各ディレクトリはコロン(:
)で区切られています。
/usr/local/bin:/usr/bin:/bin
PATH
のディレクトリは左から右へ検索され、
一覧の中で最初にマッチした実行可能なファイルが、他のものより優先されます。
この例であれば、/usr/local/bin
が最初に検索され、次に/usr/bin
、その次に/bin
と続きます。
楔(Shim)の理解
rbenvはPATH
の最初に、楔となるディレクトリを挿入することによって動作します。
~/.rbenv/shims:/usr/local/bin:/usr/bin:/bin
再ハッシュ(rehashing - 作りなおす)と呼ばれるプロセスを通して、
rbenvはディレクトリ内のRuby-irb
、gem
、rake
、rails
、ruby
等の、
各インストール済みのバージョンを跨いで、Rubyコマンドにマッチする楔を維持します。
楔はrbenvに沿ってコマンドを渡すだけの軽量な実行ファイルです。
rbenvがインストールされているとrake
の実行の際に、OSは次のように動作します。
-
rake
という実行可能ファイルを探すために、PATH
が検索されます。 -
PATH
で最初に見つかるrake
という名前のrbenvの楔を見つけます。 -
rake
という名前の楔を実行します。 これは、rbenvによって渡されるコマンドです。
Rubyバージョンの選択
楔を実行する際に、rbenvは使用するRubyのバージョンを、下記の情報源をこの順番で読み取ることで決定します。
-
指定されていれば、
RBENV_VERSION
環境変数が使用されます。 rbenv shellコマンドを使用して、現在のシェルのセッションに、 この環境変数を設定することが可能です。 -
実行したスクリプトと、そのファイルからファイルシステムのルートに至るまでの各親ディレクトリが検索されることによって、
最初に発見される
.ruby-version
ファイルが使用されます。 -
現在のワーキングディレクトリと、そこからファイルシステムのルートに至るまでの各親ディレクトリが検索されることによって、
最初に発見される
.ruby-version
ファイルが使用されます。 rbenv localコマンドを使用することで、 現在のワーキングディレクリ内の.ruby-version
を編集することが可能です。 -
グローバルの
~/.rbenv/version
ファイルが使用されます。 rbenv globalコマンドを使用して、 このファイルを編集することが可能です。 もしグローバルのバージョンファイルが存在しなければ、 rbenvはあなたが"system"のRubyを、 すなわちPATHにrbenvが無い場合に実行されるバージョンを使用することを望んでいるとみなします。
Rubyのインストール先の特定
rbenvはアプリケーションに指定されているRubyのバージョンを特定すると、 それに対応するRubyインストールに沿ってコマンドを渡します。
各バージョンのRubyは、~/.rbenv/versions
下の自身のディレクトリ内にインストールされます。
例えば、下記のように各バージョンのRubyをインストールすることが可能です。
- ~/.rbenv/versions/1.8.7-p371/
- ~/.rbenv/versions/1.9.3-p327/
- ~/.rbenv/versions/jruby-1.7.1/
rbenv用のバージョン名は、単純に~/.rbenv/versions
内のディレクトリの名前になります。
© 2010 - 2017 STUDIO KINGDOM