どうも。エンジニア経験が(全く)ないruby新生児です。
初めてしっかり言語学習に時間をかけて寝返りが打てる程度にはなろうと思い、業務的にも身近なrubyの勉強を始めようとしたら、のっけからつまずいてしまいました…orz
ruby(rails)の環境設定を進めて行く上で解決に時間かかった(ググってもいまいち出てこなかった)エラーについて残そうと思います。
起こったこと
-
こちらの記事で
rbenv-communal-gems
とかpry
入れておくと良いよ!と書かれていたので入れてみた
(各々の役割については割愛) -
irb(or pry)起動 → 日本語文字が入力できない!?
-
readline
をインストール -
ruby再インストール
-
pryを起動したら以下の謎エラーが発生↓
mkdir: /usr/local/bin/../version_cache: Permission denied
/usr/local/bin/rbenv-communal-gem-home: line 21: /usr/local/bin/../version_cache/2.5.6: No such file or directory
※ エラーは表示されるもののpry
自体は問題なく動いた(それが更にすっっっごくモヤッと)
※ 再インストール前まではこんなエラー表示されていなかった
原因
不明。探ろうとしてすごく時間を取られた…orz
上に記載したエラー内容を見ると、読んで字の如く言われてることは以下の2点
- お前に
mkdir
する権限はない -
/usr/local/bin/rbenv-communal-gem-home
21行目に書かれてるディレクトリは存在しない
とりあえずここを解決しよう。
解決まで
エラーの原因を探る
#!/usr/bin/env bash
#
# Summary: Show the communal gem home if communal gems are enabled
#
# Usage: rbenv communal-gem-home [<version>]
# Provide rbenv completions
if [ "$1" = "--complete" ]; then
exec rbenv-versions --bare
fi
rbenv_version="${1:-$(rbenv-version-name)}"
if [ -L "$RBENV_ROOT/versions/$rbenv_version/lib/ruby/gems" ]; then
cachedir="${BASH_SOURCE%/*}/../version_cache"
cachefile="$cachedir/$rbenv_version"
if [ -f "$cachefile" ]; then
communal_version="$(cat $cachefile)"
else
mkdir -p "$cachedir"
communal_version="$("$RBENV_ROOT/versions/$rbenv_version/bin/ruby" -rrbconfig -e 'puts RbConfig::CONFIG["ruby_version"]')"
echo "$communal_version" > "$cachefile"
fi
echo "$RBENV_ROOT/gems/$communal_version"
else
exit 1
fi
とってもシンプルなif文のみで書かれたbashスクリプトさん(瀕死)。
とりあえず21行目を見てみると echo "$communal_version" > "$cachefile"
ってある。
この2つの変数の内、$cachefile
が19行目の mkdir -p
とも絡んでるし怪しい。-p
のオプションが分からずをググったら エラーを表示せず記述したディレクトリが存在しなければ作成する ものらしい(参照)。
つまり発生していたエラーは
-
makdir -p "$cachefile"
→ ディレクトリあるかな?ない、つくろう! → 権限なかった。作れんわ → エラー -
$communal_version
を$cachefile
にリダイレクトだ! →$cachefile
なんてディレクトリねぇよ、権限もねぇし作れんよ
と言われていたんですね。
つまり諸悪の根源は14行目のこいつ
cachedir="${BASH_SOURCE%/*}/../version_cache"
ここのパスを変更すれば良い。
・・・
・・・・・・・
・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・
どこのパスに向ければいいの??(←これ一番困った)
対応する
いろいろ捏ね繰り回して考えて巡り巡って出した答えとしては、
* version_cache
があるパスが分かればいい
* もしなけりゃ適当に作っちゃおう(その為のmakdir -p
(pオプション)なんだし)
(この辺り本職のエンジニアさんたちならどう判断するんだろう…)
問題となっているのはgemでinstallしたrbenv-communal-gems
なわけだから、この周辺のディレクトリを漁りましょう。
エラー吐いてたのは/usr/local/bin/rbenv-communal-gem-home
なので、この辺に該当ディレクトリがないかな??と思いbin
を覗いたら全てシンボリックリンクであることがわかった
略)
lrwxr-xr-x 1 username admin 31 9 19 16:52 rbenv -> ../Cellar/rbenv/1.1.2/bin/rbenv
lrwxr-xr-x 1 username admin 65 9 21 23:19 rbenv-communal-gem-home -> ../Cellar/rbenv-communal-gems/1.0.1_1/bin/rbenv-communal-gem-home
lrwxr-xr-x 1 username admin 57 9 21 23:19 rbenv-communize -> ../Cellar/rbenv-communal-gems/1.0.1_1/bin/rbenv-communize
lrwxr-xr-x 1 username admin 47 9 19 16:52 rbenv-install -> ../Cellar/ruby-build/20190828/bin/rbenv-install
lrwxr-xr-x 1 username admin 57 9 21 23:19 rbenv-sequester -> ../Cellar/rbenv-communal-gems/1.0.1_1/bin/rbenv-sequester
lrwxr-xr-x 1 username admin 49 9 19 16:52 rbenv-uninstall -> ../Cellar/ruby-build/20190828/bin/rbenv-uninstall
lrwxr-xr-x 1 username admin 44 9 19 16:52 ruby-build -> ../Cellar/ruby-build/20190828/bin/ruby-build
(余談だけどこのシンボリックリンクの群れを見て[パスを通すってこういうことか!!]となんとなく思ったり.)
rbenv-communal-gems
の実体は ../Cellar/rbenv-communal-gems
配下にあると。
んだばそこ覗いたらすぐ見つかった version_cache
.
../Cellar/rbenv-communal-gems/1.0.1_1/version_cache
にあった。
これで勝てる...!!
問題だった cachedir
を以下のように書き換えました。
cachedir="${BASH_SOURCE%/*}/../Cellar/rbenv-communal-gems/1.0.1_1/version_cache"
#cachedir="${BASH_SOURCE%/*}/../version_cache"
これで再度pry
を打ってみたところ、エラー発生しなくなりました(めでたしめでたし
あとがき
前に環境構築したときは問題なく行ったので今回のように出鼻からくじかれるとは思いもしませんでした。
どの過程が原因で起きたエラーかも分からなかったので手順やらHomebrew,rbenv,gem,環境変数やらshell(bash)などなど,いろんなのを調べまくりました。エラー1個で大騒ぎはしたものの色々と知識を得られたので良しとします。
ruby新生児のアマグラマーがプログラマーに至るまで大いに努力したいと思います。
余談)多分version_cache
ディレクトリが見つからなかったら適当なディレクトリを cachedir
にあてがってしまってよかったんだろうなと終わってから思いました。