Macでgem install
しようとしたら
You don't have write permissions for the /Library/Ruby/Gems/2.3.0 directory
と怒られてインストールできなくなった状態について。
You don’t have write permissions for the /Library/Ruby/Gems/2.3.0 directory
問題に気づいた一番最初は
Octopressを操作する上でrake
コマンドを使ってエラーが出て、
さらに
$ bundle install
bash: bundle: command not found
と言った感じにbundle
コマンドが見れなくてなっていて、
$ gem install bundle
ERROR: While executing gem ... (Gem::FilePermissionError)
You don't have write permissions for the /Library/Ruby/Gems/2.3.0 directory.
gem install
しようとするとこういった感じにエラーが出てできなくなっていました。
$ which ruby
/usr/bin/ruby
$ which gem
/usr/bin/gem
と見てみるとこれらはシステムのものを指しています。
なのでこれを使ってインストールしようとすると上記のシステムのディレクトリに入れようとして、
これがroot
のものなのでユーザーで入れようとするとエラーになります。
sudo
すれば入りますが、今まではしないで出来ていました。
それはruby
もgem
もHomebrewでruby
をインストールした時に入れた
/usr/local/bin/ruby
とかだったので/usr/local/
以下にユーザー権限で
入れられるところにGemも入っていたためです。
ただ、brew list
してみるとruby
はあります。ですが/usr/local/bin/rubyはありません。
infoを見てみると
$ brew info ruby
ruby: stable 2.6.1 (bottled), HEAD [keg-only]
Powerful, clean, object-oriented scripting language
https://www.ruby-lang.org/
/usr/local/Cellar/ruby/2.6.1 (19,340 files, 32.3MB)
Poured from bottle on 2019-02-01 at 03:04:57
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/ruby.rb
==> Dependencies
Build: pkg-config (installed)
Required: libyaml (installed), openssl (installed), readline (installed)
==> Options
--HEAD Install HEAD version
==> Caveats
By default, binaries installed by gem will be placed into:
/usr/local/lib/ruby/gems/2.6.0/bin
You may want to add this to your PATH.
ruby is keg-only, which means it was not symlinked into /usr/local,
because macOS already provides this software and installing another version in
parallel can cause all kinds of trouble.
If you need to have ruby first in your PATH run:
echo 'export PATH="/usr/local/opt/ruby/bin:$PATH"' >> ~/.bash_profile
For compilers to find ruby you may need to set:
export LDFLAGS="-L/usr/local/opt/ruby/lib"
export CPPFLAGS="-I/usr/local/opt/ruby/include"
For pkg-config to find ruby you may need to set:
export PKG_CONFIG_PATH="/usr/local/opt/ruby/lib/pkgconfig"
ということでkeg-onlyになっている様です。
以前は違ったはず、と思ってFormula の履歴を見てみると
commit b4bf45228a60a9a64a0f17d0374b27ffe84c862c
Author: Mike McQuaid <[email protected]>
Date: Tue Oct 30 12:56:46 2018 +0000
ruby: make keg-only (as provided by macOS).
This makes it consistent with the other Ruby formulae and avoids weird
PATH issues (exactly what keg-only is designed for).
ということで去年の10月終わりにkeg-onlyに切り替えた模様。
ただその後もbrew upgrade
はしてたと思うのですが、今まで大丈夫でした。
この時はruby 2.5.3で、2.6.0になったのが12月25日、2.6.1が1月30日。
1月の終わりには一度触って大丈夫だった記憶があるのでこの2.6.1に切り替わったタイミングが怪しい。
ただその段階ではrubyとrubygems(3.0.13.0.2) の変更があっただけで、2.5.3から上がったときよりは変化が少ないくらいです。
ちょっとその辺、度のタイミングで変化があったのか(/usr/local/binのリンクが削除された)のかわかりませんが ともかくこれが問題なので、
export PATH="/usr/local/opt/ruby/bin:$PATH"
を.bashrcに追加。
これでOKと思ったら、
$ bundle install
Traceback (most recent call last):
1: from /usr/local/opt/ruby/bin/bundle:23:in `<main>'
/usr/local/opt/ruby/bin/bundle:23:in `load': cannot load such file -- /usr/local/lib/ruby/gems/2.6.0/gems/bundler-1.17.3/exe/bundle (LoadError)
というエラーが。どうも/usr/local/opt/ruby/bin/bundleで定義されたbundleのバージョンと 入れられた最新のbundleのバージョン(2.0.1)が食い違ってるのが問題の模様。
gem
側の問題なので、
$ gem update
とすることで上記のbundle
がアップデートされ新しいパッケージのバージョンを見に行くようになって使える様になりました。