rbenvを使うには~/.bash_profile
なりなんなりで環境変数を適切に設定してやる必要がある。というわけで、systemdのように通常のシェルと環境変数を共有していない(~/.bash_profile
を経由しない)環境でrbenvなRubyを使おうとするとうまくいかないケースがある。
rbenv: version `XXX' is not installed
編
- 前提:
- 環境変数
RBENV_ROOT
が設定されていない。 - rbenvをシステムワイドインストールなどのために
~/.rbenv
以外のところに置いている(以下では/opt/rbenv
にあるとして説明する)。
- 環境変数
- 問題:
/opt/rbenv/shims/bundle exec ...
では動くのに、/opt/rbenv/bin/rbenv exec bundle exec ...
ではrbenv: version `XXX' is not installed
となって動かない。 - 理由:rbenvはインストールされたバージョンを探すのに
${RBENV_ROOT}/versions/XXX
を見る。/opt/rbenv/shims/bundle
は途中でRBENV_ROOT
環境変数を正しくセットするけれど、/opt/rbenv/bin/rbenv exec
はそうしないので、あるべき場所を探せず、見つからない。 - 解決策:
/opt/rbenv/shims/bundle exec ...
でかまわない。
-bash: ruby: command not found
編
引き続きrbenvは/opt/rbenv
にあるとして説明する(が、こちらは~/.rbenv
にあっても起きそう)。
- 前提:
-
$PATH
に/opt/rbenv/shims
が入っていない。 -
rbenv-binstubs
を使っている。 -
BUNDLE_BIN: ".bundle/bin"
である(すなわちbundle install --binstubs=.bundle/bin
とした)として説明する。ちなみにパスを指定していなければbin
になる(これはRails4以降と衝突することで有名)。
-
- 問題:
/opt/rbenv/shims/bundle exec ...
すると-bash: ruby: command not found
となって動かない。 - 原因:
- どこかで
#!/usr/bin/env ruby
していて動いていない。本来はrbenvが$PATH
に/opt/rbenv/versions/XXX/bin
を加えていて、ここにruby実行ファイル(正確にはそのラッパー)があるので動く。 -
$PATH
に加えられるべき/opt/rbenv/versions/XXX/bin
は、rbenv which
を内部的に呼んでその結果を使っている。 -
rbenv-binstubs
は、rbenv which
に割り込んで、/opt/rbenv/versions/XXX/bin
より先にカレントディレクトリの下.bundle/bin
を探す。ここにbundle
が入っているとこちらがrbenv which
の結果として返されて$PATH
に追加されるが、ここにはruby
は(当然)いない。$PATH
に/opt/rbenv/shims
が入っていなければruby
が見つからないことになる。 - (
$PATH
に/opt/rbenv/shims
が入っていればこっちのruby
があるのでちゃんと動く。)
- どこかで
- 解決策:
- とりあえず
.bundle/bin/bundle
を消せば動くようになる。 - 抜本的には、
bundle install --binstubs=.bundle/bin
とせず、必要なgemに限ってbundle binstubs <gemname> --path=.bundle/bin
とするのがよい。
- とりあえず