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 に書かれているのだろう。見てみると:
# 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_PATH
と gem install --install-dir
を組み合わせることにした:
export GEM_PATH=$PWD/local-gems:$GEM_PATH
gem install --install-dir "$PWD/local-gems" $gem_name