rbenv-communal-gems を使うと GEM_HOME が無視される

  • 5
    Like
  • 0
    Comment
More than 1 year has passed since last update.

Gem をローカルディレクトリにインストールしたくて次のように実行した:

export GEM_HOME=$PWD/local-gems
gem install $gem_name

ところが gem は環境変数 GEM_HOME で指定したディレクトリではなくデフォルトのディレクトリ(gem environment gemdir で表示される場所)にインストールされてしまった。

GEM_HOME に適当な値をセットして gem environment を実行すると、 INSTALLATION DIRECTORY に GEM_HOME の値が反映されていないことが分かった:

GEM_HOME=xxx gem environment
出力
RubyGems Environment:
  - RUBYGEMS VERSION: 2.4.5
  - RUBY VERSION: 2.2.0 (2014-12-25 patchlevel 0) [x86_64-darwin14]
  - INSTALLATION DIRECTORY: /Users/uasi/.rbenv/gems/2.2.0
(略)
  - SYSTEM CONFIGURATION DIRECTORY: /Users/uasi/.rbenv/versions/2.2.0/etc
(略)
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :backtrace => false
     - :bulk_threshold => 1000
     - "install" => "--env-shebang"
     - "gemhome" => "/Users/uasi/.rbenv/gems/2.2.0"
     - :benchmark => false
     - "gem" => "--no-document"
(略)

GEM CONFIGURATION を見ると - "gemhome" => "/Users/uasi/.rbenv/gems/2.2.0" という行がある。環境変数よりもここの設定が優先されているようだ。 ~/.gemrc ではそんな設定はしていないので SYSTEM CONFIGURATION DIRECTORY 内の gemrc に書かれているのだろう。見てみると:

/Users/uasi/.rbenv/versions/2.2.0/etc/gemrc
# added by rbenv communize
install: "--env-shebang"
gemhome: "/Users/uasi/.rbenv/gems/2.2.0"

added by rbenv communize とあるので rbenv communize を実行したときに書き込まれたようだ。このコマンドは rbenv のプラグイン rbenv-communal-gems のもので、 rbenv が管理する複数の Ruby の gem ディレクトリを共通化するためのものだ。

共通化した gem ディレクトリを gemhome として書き込んでいるのだが、その設定の優先度が高いために環境変数 GEM_HOME が無視されるということか。

仕方がないので GEM_PATHgem install --install-dir を組み合わせることにした:

export GEM_PATH=$PWD/local-gems:$GEM_PATH
gem install --install-dir "$PWD/local-gems" $gem_name