LoginSignup
3
4

More than 5 years have passed since last update.

rbenvとrbenv-binstubsのパスまわり(主にsystemd対策)

Last updated at Posted at 2018-03-03

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とするのがよい。
3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4