LoginSignup
46
25

More than 3 years have passed since last update.

【Rails】Nokogiri関連のインストールエラーと戦うための方法 総集編【これでダメなら多分】

Last updated at Posted at 2020-12-14

自己紹介

高等学校国語科の教員から転職後、物流×ITの株式会社ダイアログでWebエンジニアとして働きつつ、本アドベントカレンダーのDMMWEBCAMPでエンジニアメンターをしておりますyukiと申します。

未経験からエンジニアを目指す方向けの質問回答や、個人メンターの相談も乗っておりますので、何かあったらDMでお願いします。

最後にポエムの宣伝

では本題へ。

本記事の概要

本記事は、Railsのプロジェクト作成時(bundle install時)に起こるGem:nokogiri関連のインストールエラーに関して、調査結果と対策をまとめたものになります。
自分でもこれ関連のエラーには非常に悩まされ、検索するたびに、Rails nokogiri インストール できないといった内容で検索候補が表示されていたので、つまづきポイントなのかな?と思ったのが執筆の動機です。

さまざまなNokogiri関連の記事を拝見した上で、改めてまとめてみようと思いましたので、何かの参考になれば幸いです。

1、前提条件やNokogiriの説明
2、何故エラーが起こるのかエラー分と、原因の調査結果
3、実際の対策

といった流れで説明させていただきます。

前提条件や筆者の環境、読むとわかること

rbenv 1.1.2-20-g143b2c9
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin19]
Rails 6.0.3.3
開発環境はローカル(Mac本体に直接構築)です。
RailsやGemfileをなんとなく知っている、rbenvやhomebrewを使っていることが前提条件です。

本記事を読んでいただくと、Nokogiri関連のエラー対策が分かります。

そもそもNokogiriとは?Gemとは?

彼を知り己を知れば百戦殆からず 孫子 謀攻篇

ということでまず、Nokogiriが何者なのか掘り下げていきましょう。

Nokogiriとは

🗒 Nokogiri(公式ドキュメント)
💻 GitHubのソースコード

調べたところ、NokogiriはRubyのGemで、スクレイピング(Webサイトから情報を抽出する)をする際に利用されるもののようです。

これは正直調査してわからなかったことなのですが、確認した限り、Rails 5.2.4系以上のバージョンでプロジェクトを作ろうとすると、自動的にbundle install対象になると思われます。こちらに関して詳しい方がいらしたら、コメントで教えてください。

ひとまず、最近のRailsのプロジェクトを作ろうとすると自動でインストールされるようです。

また、公式のGithubをみると、以下のようなことが書いてあります。

Requirements
Ruby 2.4.0 or higher, including any development packages necessary to compile native extensions.
In Nokogiri 1.6.0 and later libxml2 and libxslt are bundled with the gem, but if you want to use the system versions:...

NokogiriにはNative Extentionというものが関わっているようです。

Native extentionとは(後でエラー対策の際にも関わってきます)

こちらは調べたところによると、ruby以外の言語にもgemが依存している際に、関連するその言語のライブラリをインストールしておく必要があるよといったもののようです。

具体的には、Nokogiriをインストールする際には以下のものが必要になるようですね。(公式Githubから引用)

libxml2 >=2.6.21 with iconv support (libxml2-dev/-devel is also required)
libxslt, built with and supported by the given libxml2 (libxslt-dev/-devel is also required)

rubyの2.4.0以上では、自動的にこれらのライブラリは含まれているようです。ただ、何かしらの原因でインストールできていないとNokogiriのインストール時にエラーが出ます。

想定されるエラー

さて、いよいよNokogiriを知ることができたので、想定されるエラーの説明です。

具体的には…

  • 新規プロジェクトをRailsで立ち上げた際のbundle installでコケる
  • これまで普通に起動できていたのに、rails sを行ったときにコケる

そしてそのメッセージが以下のような感じである。

# ①こんなの
Could not find nokogiri-<nokogiriのバージョン> in any of the sources
Run `bundle install` to install missing gems.

# ②もしくはこんなの
libiconv is missing.  please visit http://nokogiri.org/tutorials/installing_nokogiri.html for help with installing dependencies.
    -----
    *** 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.

# ③あとはこんなの
An error occurred while installing nokogiri (nokogiriのバージョン), and Bundler cannot continue.
Make sure that `gem install nokogiri -v 'nokogiriのバージョン' --source 'https://rubygems.org/'` succeeds

もー嫌になりますよね。特に③、gem install nokogiri -v 'nokogiriのバージョン' --source 'https://rubygems.org/'を実行して、無事インストールされたのにもう一回bundle installすると全く同じエラーが出たことのある人はいませんか?

対策を考えていましょう。

エラーのパターンと対策:関連するパッケージがインストールできていない

まず、可能性として「Native extentionとは」のところで説明させていただいた関連するライブラリがインストールできていない可能性があります。

そちらのライブラリを直接インストールすると解決する場合があるので、やってみましょう。

$ brew tap homebrew/dupes
$ brew install libxml2 libxslt libiconv
$ brew link --force libxml2 libxslt libiconv

その後

$ bundle config build.nokogiri --use-system-libraries
$ bundle install

いかがでしたでしょうか。これでもダメな場合、先に進んでください。

エラーのパターンと対策:bundle install先の書き込み権限がない(?)

自分が何回か引っかかったケースとして、bundle install先のフォルダにアクセスする権限がなく、どんなにコマンドを実行しても書き込むことができなかったというものがありました。この場合は、なぜか直接gem nokogiriを指定してsudoで実行してもうまくいきませんでした。

ということで、書き込み権限を与えます。Gemfileのあるディレクトリで、以下を実行してみてください。

$ sudo chmod 666 Gemfile
$ sudo chmod 666 Gemfile.lock
$ bundle install

それでもダメなら、次へ。

あんまり良くないが、とりあえず解決したい人向け(これで何度も解決しました。)

何人かに相談していただいて、一緒に悩んで試行錯誤した結果、一番こちらの方法で解決しましたが、暴力的なので責任は取れません。
どうにもこうにも解決せず、どうしてもすぐに解決したい場合ご利用ください。

結論:現在使っているrubyをアンインストールし、再度インストールし、もう一度bundle installし直すことです。※もしくは、それが怖い場合は、新しいバージョンのrubyをインストールして今後はそちらを使っていきましょう。

再インストール編

まず、ターミナルでbashを使っている方は、bash_profileの方にrubyやbundle関係の変な記述がないかチェックしましょう。

$ vi ~/.bash_profile

私の場合、ruby関係の記述は以下の二行だけでした。責任は負い兼ねますが、余計なものは一旦削除してもいいかもしれません。

.bash_profile
export PATH="~/.rbenv/shims:/usr/local/bin:$PATH"
eval "$(rbenv init -)"

そちらが確認できたら、rubyのバージョンを確認し、アンインストール、再インストール、キャッシュを消し、そのバージョンを今後は適用するようにコマンドを実行します。

$ ruby -v
$ rbenv uninstall [表示されたバージョン]
$ rbenv install [上と同じバージョン]
$ rbenv rehash 
$ rbenv local  [上と同じバージョン]
$ rbenv global [上と同じバージョン]

ここまで実行できたら、改めてrails newや直接bundle installなどを実行してみてください。

新しいバージョンのrubyを入れる場合

上と同様、.bash_profileの確認後

$ rbenv install -l
$ rbenv install [一覧の中の好きなバージョン]
$ rbenv rehash 
$ rbenv local  [上と同じバージョン]
$ rbenv global [上と同じバージョン]

ここまで実行できたら、改めてrails newや直接bundle installなどを実行してみてください。

まとめ

いかがだったでしょうか。nokogiri関係のエラーは、さまざまな原因があり、それは他ライブラリのせいだったり、書き込み権限のせいだったり、はたまた色々やった結果.bash_profileのパス設定がおかしかったりなど、色々な要因があると思います。

最後は極端な方法になってしまいましたが、この記事が誰かの役に立ちますと幸いです。
以下にこれまで読んだ記事を参考記事として記載させていただきます。ぜひ併せてご覧ください。

参考記事

46
25
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
46
25