rcmdnk's blog

Amazon.co.jp: プログラミングスクールに通う前にやっておきたいRuby超入門 eBook: 迫 佑樹: Kindleストア

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すれば入りますが、今まではしないで出来ていました。 それはrubygemも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がアップデートされ新しいパッケージのバージョンを見に行くようになって使える様になりました。

Sponsored Links
Sponsored Links

« PoetryでPython CLIツールを簡単にPyPiに登録する Homebrew 2.0.0リリース: Linuxbrewの統合 »

}