4
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

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

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とするのがよい。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
4
Help us understand the problem. What are the problem?