1. ホーム
  2. ruby-on-rails

[解決済み] RVMとrbenvは実際にどのように動作するのでしょうか?

2022-05-30 22:10:46

質問

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

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

どのように解決するのですか?

簡単に説明すると、rbenv はあなたの環境の PATH . コンセプトはシンプルですが、悪魔は細部に宿るのです; 下記に完全なスクープがあります。

まず、rbenvは シム を作成します。 ruby , irb , rake , gem といった具合に)インストールされているすべてのバージョンのRubyにまたがっています。この処理は リハッシュ . 新しいバージョンのRubyをインストールしたり、コマンドを提供するgemをインストールしたりするたびに、以下のように実行します。 rbenv rehash を実行して、新しいコマンドがシム化されていることを確認します。

これらのシムは、単一のディレクトリ ( ~/.rbenv/shims デフォルト) にあります。rbenv を使うには、shims ディレクトリをあなたの PATH :

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

そして、いつでも ruby をコマンドラインから実行したり、shebang が次のようなスクリプトを実行したりします。 #!/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 は "system" Ruby-すなわち、rbenv がパスにない場合に実行されるバージョンを使用したいのだと仮定します。

(プロジェクト固有のRubyのバージョンを設定することは rbenv local コマンドで設定できます。 .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 のインストール から 環境設定 , gemsets"の管理。 そしてさらに 自動化 bundle exec .

IRC サポートと Ruby のバージョン切り替えにどんな関係があるのかよくわかりませんし、rbenv はサポートを必要としないほどシンプルでわかりやすく設計されています。しかし、もし助けが必要なら、問題追跡と Twitter がクリック数回で利用できます。

情報開示: 私は rbenv、ruby-build、および rbenv-vars の作者です。