既存のプロジェクトで、これまで問題なくできていたのが突然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が消えていたので、とりあえず先に進む。。
追記 2021/3/11
xcodeのバージョン確認
$ xcodebuild -version
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