回答:
簡単な説明:rbenvは、環境のにフックすることで機能しますPATH
。概念は単純ですが、悪魔は細部にあります。以下の完全なスクープ。
まず、rbenvが作成したシムすべてのコマンドのために(ruby
、irb
、rake
、gem
など)ルビーのすべてのインストールバージョン間。このプロセスは、リハッシュと呼ばれます。Rubyの新しいバージョンをインストールするか、コマンドを提供するgemをインストールするたびにrbenv rehash
、新しいコマンドがシムされていることを確認するために実行します。
これらのシムは単一のディレクトリ~/.rbenv/shims
にあります(デフォルト)。rbenvを使用するには、shimディレクトリをあなたの前に追加するだけですPATH
:
export PATH="$HOME/.rbenv/shims:$PATH"
その後ruby
、コマンドラインから実行するか、シバンがと表示するスクリプトを実行する#!/usr/bin/env ruby
と、オペレーティングシステムが~/.rbenv/shims/ruby
最初にそれを見つけruby
て、インストールした他の実行可能ファイルの代わりに実行します。
各シムは、実行される小さな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
ファイルの内容を使用して設定しようとします。(プロジェクト固有の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はちょうど切り替えのバージョンに関係しているが、プラグインの盛んな生態系があなたからすべてを行うのに役立ちますルビーをインストールするには、ご使用の環境をセットアップし、「gemsets」を管理しても、自動化します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については、ルビーを管理するだけでなく、他のツールよりもはるかに多くカバーしています(RVMとrbenv以外には他にもあります:https ://twitter.com/#!/mpapis/ status / 171714447910502401)
Freenodeサーバーの「#rvm」チャネルでIRCを利用してすぐにサポートできることを忘れないでください。
上記の優れた答えを要約すると、RVMとrbenvの主な実用的な違いは、Rubyのバージョンが選択されたときです。
rbenv:
rbenvは、パスの先頭にシムを追加します。これは、Rubyと同じ名前のコマンドです。あなたが入力するとruby
、コマンドラインで(それはまた、「ルビー」と呼ばれ、パスに最初に来ているので)、シムが代わりに実行されます。シムは、環境変数または.rbenv_version
ファイルを探して、委任するRubyのバージョンを指示します。
RVM:
RVMでは、を呼び出すことでRubyのバージョンを直接設定できますrvm use
。さらに、cd
システムコマンドもオーバーライドします。ときにあなたがcd
含まれているフォルダに.rvmrc
ファイルを、内のコード.rvmrc
ファイルが実行されます。これは、Rubyのバージョンやその他の好きなものを設定するために使用できます。
その他の違い:
もちろん他にも違いがあります。RVMにはすぐに使えるgemsetがありますが、rbenvにはもう少しハッキングが必要です(ただしそれほど多くはありません)。どちらも問題に対する機能的な解決策です。
主な違いは、ルビーがいつどのように切り替えられるかです。Rubyが切り替わります。
RVMは、変更されたcd
コマンドとによるRubyの手動選択に依存していrvm use
ます。rbenvは、rubyを選択するデフォルトのメカニズムとして、すべての基本的なrubyコマンドにラッパーまたは「shims」を使用します。RVMは、gem、rake、rubyなどの基本的なコマンドラインツールのラッパーも作成します。これらは、たとえばCronJobs(http://rvm.io/integration/cron/を参照)で使用されますが、Rubyバージョンを切り替えるデフォルトのメカニズムではありません。
したがって、どちらの方法でも、コマンドを上書きしてラッパーを使用することにより、適切なRubyバージョンを「自動的に」選択します。rvmは、cdなどのシェルコマンドをオーバーライドします。rbenvは、ruby、irb、rake、gemなどのすべての基本的なrubyコマンドをオーバーライドします。
rvm system
env > before
rvm jruby # or whatever
env > after
diff after before
およそあなたに与える:
< GEM_HOME=$HOME/.gem/ruby/1.9.1
---
> GEM_HOME=$HOME/.rvm/gems/jruby-1.6.6
< GEM_PATH=$HOME/.gem/ruby/1.9.1
---
> GEM_PATH=$HOME/.rvm/gems/jruby-1.6.6:$HOME/.rvm/gems/jruby-1.6.6@global
*bunch of rvm_*
> MY_RUBY_HOME=$HOME/.rvm/rubies/jruby-1.6.6
> RUBY_VERSION=jruby-1.6.6
> IRBRC=$HOME/.rvm/rubies/jruby-1.6.6/.irbrc
そしてそれは付加します:
$HOME/.rvm/gems/jruby-1.6.6/bin:$HOME/.rvm/gems/jruby-1.6.6@global/bin
に $PATH