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とするのがよい。
- とりあえず