144

RVMとrbenvが実際にどのように機能するかに興味があります。

明らかに、Rubyとgemsetの異なるバージョン間で交換しますが、これはどのように達成されますか?私は彼らが単にシンボリックリンクを更新していると思っていましたが、コードを掘り下げて(そしてBashの知識が表面的であることを認めなければなりません)、彼らはこれ以上のことをしているようです。

4

5 に答える 5

247

簡単な説明: rbenv は、環境の にフックすることによって機能しますPATH。コンセプトはシンプルですが、悪魔は細部に宿ります。以下の完全なスクープ。

まず、rbenv は、インストールされているすべてのバージョンの Ruby にわたって、すべてのコマンド ( 、、など) のshimを作成します。このプロセスは再ハッシュと呼ばれます。新しいバージョンの Ruby をインストールするか、コマンドを提供する gem をインストールするたびに、 を実行して、新しいコマンドがシミングされていることを確認します。rubyirbrakegemrbenv 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 のバージョンを特定し、そのバージョンに対応するコマンドを実行します。方法は次のとおりです。

  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/versionます。)

環境変数で武装したRBENV_VERSIONrbenv は、~/.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 の作成者です。

于 2012-02-23T22:20:55.003 に答える
19

詳細な記事を書きました: http://niczsoft.com/2011/11/what-you-should-know-about-rbenv-and-rvm/

基本的な違いは、シェル環境が変更される場所です。

  • RVM: Rubyを変えると変わる。
  • rbenv: Ruby/gem 実行可能ファイルを実行すると変更されます。

また、RVM に関することは、Ruby を管理するだけでなく、他のツールよりも多くのことをカバーすることです (RVM と rbenv 以外にも他のツールがあります: https://twitter.com/#!/mpapis/状態/171714447910502401 )

Freenode サーバーの "#rvm" チャネルで IRC で得られるインスタント サポートを忘れないでください。

于 2012-02-22T15:58:22.943 に答える
16

上記の優れた回答を要約すると、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 にはもう少しハッキングが必要です (ただしそれほど多くはありません)。どちらも問題に対する機能的な解決策です。

于 2012-03-15T15:44:46.983 に答える