[解決済み] RVMとrbenvは実際にどのように動作するのでしょうか?
質問
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 のバージョンを判断し、そのバージョンに対応するコマンドを実行します。以下はその方法です。
-
もし
RBENV_VERSION
環境変数が設定されている場合、その値によって使用するRubyのバージョンが決定されます。 -
もし現在の作業ディレクトリに
.rbenv-version
ファイルがある場合、その内容はRBENV_VERSION
環境変数を設定します。 -
がない場合は
.rbenv-version
ファイルがない場合、rbenv はそれぞれの親ディレクトリを検索して.rbenv-version
ファイルがないか、ファイルシステムのルートに到達するまで 探します。もし見つかったら、その内容を使ってRBENV_VERSION
環境変数を設定するために使用されます。 -
もし
RBENV_VERSION
がまだ設定されていない場合、rbenv は~/.rbenv/version
ファイルの内容を使用して設定を試みます。 - バージョンがどこにも指定されていない場合、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 の作者です。
関連
-
[解決済み】Ruby: 特定のバージョンのruby gemをインストールする方法は?
-
[解決済み] どのようにrailsでラジオボタンを正しく使用するには?
-
[解決済み] heroku open - no app specified
-
[解決済み] RVMでRubyのデフォルトバージョンを設定するには?
-
[解決済み] Rubyのswitch文の書き方
-
[解決済み] Rubyでnilとemptyとblankを理解する方法
-
[解決済み] Ruby on Railsで現在の絶対URLを取得するにはどうすればよいですか?
-
[解決済み] gemのインストールで --no-ri --no-rdoc をデフォルトにするには?
-
[解決済み] RVM (Ruby Version Manager) をシステムから削除する方法
-
[解決済み] rbenvがrubyのバージョンを変更しない
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Rails: sudo "コマンドが認識されないのはなぜですか?
-
[解決済み】gemのインストールができない - gemネイティブ拡張の構築に失敗 - そのようなファイルをロードできない -- mkmf (LoadError)
-
[解決済み】OS X Yosemite 10.10.5 で [Ruby on Rails] 5 をインストールすると extconf が失敗して終了コード 1 エラーになる。
-
[解決済み] Mac OS Xにhomebrewがインストールされているかどうかを確認する方法
-
[解決済み] RailsのRootディレクトリのパス?
-
[解決済み] Errno::EACCESS: パーミッションが拒否された @ dir_s_mkdir
-
[解決済み] Rails ExecJS::ProgramError in Pages#home?
-
[解決済み] RoRにおけるSpringサーバーの機能とは?
-
[解決済み] 構文エラー "構文エラー、予期しない入力終了、keyword_endを期待 (SyntaxError)"
-
[解決済み] gemのインストール中に "permission denied "エラーが発生するのはなぜですか?