rbenv の global と local の違い

rbenv

rbenvRubyのバージョンを行き来するのにとても便利ですが、globallocalや、はたまたrbenvが使わないユーザの場合でどのように挙動が違うのかを記します。

前提条件

$ rbenv versionsを実行した際に、以下のようにsystem2.3.12.4.02.4.1がインストールされているとします。

$ rbenv versions
* system (set by /home/taro/.rbenv/version)
  2.3.1
  2.4.0
  2.4.1

global と local の違い

結論

  • globalで指定されたバージョンは、そのユーザが$ rubyを実行する際のバージョン
  • localで指定されたバージョンは、そのユーザが特定のディレクトリ配下で$ rubyを実行する際のバージョン

つまり、localglobalを上書きします。

具体例

rbenvが設定されているユーザであるtaroでログインしているとします。

global とは

ユーザがtaroですので、どこのディレクトリでも*1$ ruby -vをすると$ rbenv versionsで指定されたバージョンが表示されます。

この際のバージョンの指定を行うのがglobalです。

local とは

特定のディレクトリ配下で特定のバージョンのRubyを使いたい場合は、そのディレクトリをカレントディレクトリとして、$ rbenv localでバージョンを指定します*2

このlocalのバージョンはglobalを上書きします。

そしてもちろん、localでバージョンを指定したディレクトリ配下にサブディレクトリを作り、その中で$ rbenv localすると、そのサブディレクトリ配下のバージョンはさらに上書きされます。

つまり

globalというのは「それを実行したユーザが$ rubyを実行するときのバージョン」であって、マシンにログインした人全てがそのバージョンになるわけではありません*3

systemというバージョンは

$ rbenv versionsを実行した際に現れるsystemというバージョンはいったい何のバージョンなのでしょうか。

これは、/usr/bin/rubyのバージョンです。つまり、rbenvsystemというバージョンを指定した場合は、/usr/bin/ruby に存在する Ruby が使われるということです。

そしてこの/usr/bin/rubyは、rbenvの環境が導入されていないあらゆる人が使うバージョンであるということになります*4

発展

gem のインストールの際に、Gemfile を用いずに $ gem install HOGEHOGE でインストールした場合には、rbenv で指定されている Ruby のバージョンに紐付いて gem がインストールされます。

つまり、rbenv2.4.0 が指定されている場合に $ gem install whenever を実行すると、rbenv2.4.0 を指している環境下でのみ $ whenever が実行できます(見つかります)。

上記の場合に rbenv2.4.0 以外のバージョンが指定されているときには、$ whenever を実行してもコマンドが見つからずに実行が失敗します。

*1:ホームディレクトリ配下でなくても

*2:バージョン番号を記した .ruby-version というファイルが作られます

*3:最初これで混乱していました

*4:一般的には、OS のパッケージとしてインストールされる Ruby になるでしょう($ sudo apt install -y ruby など)

Powered by はてなブログ