箱のプログラミング日記。

渋谷の自社開発企業でRails書いてます。

bundle installでnokogiriのインストールエラー【Rails】

f:id:y_hakoiri:20191120232646j:plain

既存のプロジェクトで、これまで問題なくできていたのが突然bundle installをするとnokogiriがインストールできないよって怒られるようになりました。

状況としては、新しいPCへの移行に際して移行アシスタントを使用してアプリケーションやファイル群を全てまるっと移行させたのですが、どうやらその影響で実行ファイルのユーザー&権限が一部変更されていたことによるエラーのようです。

ハマったエラー

Fetching nokogiri 1.8.2
Installing nokogiri 1.8.2 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /Users/hako/Project/sample_app/src/app/vendor/bundle/ruby/2.4.0/gems/nokogiri-1.8.2/ext/nokogiri
/Users/hako/.rbenv/versions/2.4.3/bin/ruby -r ./siteconf20200818-3523-296ae9.rb extconf.rb
checking if the C compiler accepts ... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=/Users/hako/.rbenv/versions/2.4.3/bin/$(RUBY_BASE_NAME)
        --help
        --clean
/Users/hako/.rbenv/versions/2.4.3/lib/ruby/2.4.0/mkmf.rb:457:in `try_do': The compiler failed to generate an executable file. (RuntimeError)
You have to install development tools first.
        from /Users/hako/.rbenv/versions/2.4.3/lib/ruby/2.4.0/mkmf.rb:572:in `block in try_compile'
        from /Users/hako/.rbenv/versions/2.4.3/lib/ruby/2.4.0/mkmf.rb:523:in `with_werror'
        from /Users/hako/.rbenv/versions/2.4.3/lib/ruby/2.4.0/mkmf.rb:572:in `try_compile'
        from extconf.rb:138:in `nokogiri_try_compile'
        from extconf.rb:162:in `block in add_cflags'
        from /Users/hako/.rbenv/versions/2.4.3/lib/ruby/2.4.0/mkmf.rb:630:in `with_cflags'
        from extconf.rb:161:in `add_cflags'
        from extconf.rb:410:in `<main>'

To see why this extension failed to compile, please check the mkmf.log which can be found here:

  /Users/hako/Project/sample_app/src/app/vendor/bundle/ruby/2.4.0/extensions/x86_64-darwin-18/2.4.0/nokogiri-1.8.2/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in /Users/hako/Project/sample_app/src/app/vendor/bundle/ruby/2.4.0/gems/nokogiri-1.8.2 for inspection.
Results logged to /Users/hako/Project/sample_app/src/app/vendor/bundle/ruby/2.4.0/extensions/x86_64-darwin-18/2.4.0/nokogiri-1.8.2/gem_make.out

An error occurred while installing nokogiri (1.8.2), and Bundler cannot continue.
Make sure that `gem install nokogiri -v '1.8.2' --source 'https://rubygems.org/'` succeeds before bundling.

In Gemfile:
  gretel was resolved to 3.0.9, which depends on
    rails was resolved to 5.1.5, which depends on
      actioncable was resolved to 5.1.5, which depends on
        actionpack was resolved to 5.1.5, which depends on
          actionview was resolved to 5.1.5, which depends on
            rails-dom-testing was resolved to 2.0.3, which depends on
              nokogiri

bundle installするとnokogiriのところで止まってしまい、上記のようなエラーが出ます。

やったこと

手打ちでnokogiriをインストールしてみる

先ほどのエラー文の最後の方にこのように書いてあったので(上から読めw)

An error occurred while installing nokogiri (1.8.2), and Bundler cannot continue.
Make sure that `gem install nokogiri -v '1.8.2' --source 'https://rubygems.org/'` succeeds before bundling.

とりあえず以下を実行

$ gem install nokogiri -v '1.8.2' --source 'https://rubygems.org/'

でもう一度bundle installしてみましたが、変わらず。

brew doctor してみる

こちらの記事の最後の方でbrew doctorをすると良いと書いてあったのでしてみることに。

どうやらnokogiriがインストールできない問題はいろいろな人が経験しているようで、解決方法の記事はたくさんあったのですが

自分の環境でのそもそもの原因を突き詰めないと永遠に終わらない気がしたので実行してみました

$ brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry or file an issue; just ignore this. Thanks!

Warning: The following directories are not writable by your user:
/usr/local/lib

You should change the ownership of these directories to your user.
  sudo chown -R $(whoami) /usr/local/lib

And make sure that your user has write permission.
  chmod u+w /usr/local/lib

Warning: No developer tools installed.
Install the Command Line Tools:
  xcode-select --install


Warning: You have unlinked kegs in your Cellar.
Leaving kegs unlinked can lead to build-trouble and cause brews that depend on
those kegs to fail to run properly once built. Run `brew link` on these:
  gettext

いくつかWarningが出ているので一つずつ潰していく。

/usr/local/lib の権限を変更

一番最初のWarningを見てみると

Warning: The following directories are not writable by your user:
/usr/local/lib

You should change the ownership of these directories to your user.
  sudo chown -R $(whoami) /usr/local/lib

And make sure that your user has write permission.
  chmod u+w /usr/local/lib

どうやら/usr/local/libのディレクトリに書き込み権限がないようで、それを変更する必要がありそうです。

権限を確認してみると

$ ls -l /usr/local/lib
-rwxr-xr-x   1 root     admin   28144  8  6 09:32 libecomlodr.dylib
-rwxr-xr-x   1 root     wheel  973488  9 16  2019 libosxfuse.2.dylib
-rwxr-xr-x   1 root     wheel     933  9 16  2019 libosxfuse.la

(実際には他にもたくさんありましたが割愛)

その他のシンボリックリンク等はユーザーが自分になっていますが、libosxfuseとlibecomlodrのファイルのみroot権限になっているみたい。

「libosxfuseとlibecomlodrが必要らしい」というのはこれまで読んだ記事にちらほら書いてあったので、なるほどと思い権限の変更を実行

$ sudo chown -R hako /usr/local/lib

(ここのsudo chown -R $(whoami) /usr/local/libって、whoamiを自分のユーザー名に置き換えるということを知らなくて詰まった時があったな。。)

実行すると

$ ls -l /usr/local/lib
-rwxr-xr-x   1 hako  admin   28144  8  6 09:32 libecomlodr.dylib
-rwxr-xr-x   1 hako  wheel  973488  9 16  2019 libosxfuse.2.dylib
-rwxr-xr-x   1 hako  wheel     933  9 16  2019 libosxfuse.la

無事ファイルの所有者が自分になりました。

念の為この時点で一度brew doctorしてみると

$ brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry or file an issue; just ignore this. Thanks!

Warning: No developer tools installed.
Install the Command Line Tools:
  xcode-select --install


Warning: You have unlinked kegs in your Cellar.
Leaving kegs unlinked can lead to build-trouble and cause brews that depend on
those kegs to fail to run properly once built. Run `brew link` on these:
  gettext

一番上のWarningが消えているので大丈夫そう(権限は変更していないですが所有者を自分にしてしまったので問題なさそう)。

次のWarningを見てみると、xcodeがインストールされてない、、?まじかよ。。

xcodeをインストール

とりあえず本当にインストールされていないのかどうか確かめてみると

$ xcode -version
bash: xcode: command not found

まじだった。

xcodeインストールするのめちゃくちゃ時間かかるし、以前すごい詰まった記憶があるから嫌だなぁと思いながらも

$ xcode-select --install

以外と3分くらいでインストール終了。

$ xcode -version
bash: xcode: command not found
$ xcode-select --install
xcode-select: error: command line tools are already installed, use "Software Update" to install updates

なんだかインストールできてなさそうだけど大丈夫か??

ただこの時点でもう一度brew doctorしてみたところWarningが消えていたので、とりあえず先に進む。。

brew link する

最後に3つめのWarning

Warning: You have unlinked kegs in your Cellar.
Leaving kegs unlinked can lead to build-trouble and cause brews that depend on
those kegs to fail to run properly once built. Run `brew link` on these:
  gettext

読んでもなんかよくわからなかったのでググってみたところ良い記事を見つけました。

HomebrewでdoctorしたらWarning: You have unlinked kegs in your Cellarとなった時の対応方法 - Qiita

どうやらパッケージに対してのリンクができていないことが原因のようです。

$ brew link gettext
Linking /usr/local/Cellar/gettext/0.20.2... 171 symlinks created

$ brew doctor
Your system is ready to brew.

成功!

無事bundle installもできました。

まとめ

  • nokogiriはinstall時のエラーが出やすい
  • 移行アシスタントを使用してPC移行を行うと全く同じ環境を再現できるが、一部ファイルのユーザーや権限が変わることもある
  • 移行アシスタントを使用してPC移行したらアプリケーション等全て引き継がれるが、Xcodeは移行されなかった
  • 困ったときはbrew doctor

参考

nokogiri を嫌いにならないで 〜インストール時のエラーを乗り越えろ〜 - Qiita

HomebrewでdoctorしたらWarning: You have unlinked kegs in your Cellarとなった時の対応方法 - Qiita