cannot load such file -- nokogiri/nokogiri (LoadError)奮闘日記

railsチュートリアルの２周目さあ頑張ろう…！と意気込んでいたのですが、
「ゼロからデプロイまで」で躓きました。

#経緯

私はこのエラー、遭遇は２回目です。（１回目は諦めました）
１回目は、railsチュートリアルを進めていく上でcloud9の容量がなくなって、一度git cloneでローカル環境に取り込んだ時です。
rails serverの時にnokogiriエラーが出ました。

私の当時の力じゃどう頑張っても解決しそうになかったので、Cloud９の容量を無料最大まで上げた環境を新たに作り、そこにgit cloneをして学習を続けました。

１周では技術が自分のものになった気がしなかったので、２周目はローカル環境で進めてみようと思い再度nokogiriエラーと戦うことになりました。

#nokogiriエラーについて

railsを勉強する上でいろんな方が遭遇しているようです。

私が遭遇したエラーは、追い切れないほどのたくさんのlogの最後に

```
'require':cannot load such file -- nokogiri/nokogiri (LoadError)
```

と出るものでしたが、調べたところ色々なエラーがあるそうです。

上記のエラー以外のnokogiriエラーに関しては

https://qiita.com/yuki82511988/items/e73224f551cb80dab2f1

こちらの記事が参考になりそうです。


#筆者の環境

Macbook Air(M1, 2020)
macOS Big Sur バージョン11.4

```ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [arm64-darwin20]```
```rbenv 1.2.0```
```Rails 6.1.4.1```

今までの短い学習経験の中で感じたこととしては、M1だと参考にできる記事とできない記事があるということです。
（自分の環境がRosetta上なのかARMアーキテクチャ上なのかという問題）

なんかうまくいかない、書いてある通りにならないと思った時にはM1の検索ワードを入れて調べるようにしてみるとヒントを手に入れられるかもしれません。
こちらの記事少し理解できました。

https://zenn.dev/osuzuki/articles/a535b2840bbea3

たくさんの記事を参考にする上で困難もあるかと思いますが私は一旦ARMアーキテクチャで進めてみようと思います。

なお、今回はbundle installをした上でrails sが起動することを成功とします。

#やってみたこと①（失敗）
https://qiita.com/java74717470/items/40678916e5f386e3866e

なんでかは分かりませんがうまくいきませんでした。

#やってみたこと②（失敗）

https://qiita.com/kazutosato/items/6dea35e97f39d8d13e83

こちらでnokogiriエラーは出なくなりました！
しかしbundle installは別のエラーが出てきました…

#次に出たエラー

railsチュートリアル通りgemファイルを書き、いざbundle installをしたら

```
Bundler could not find compatible versions for gem "actionpack":
  In snapshot (Gemfile.lock):
    actionpack (>= 6.1.4.1)

  In Gemfile:
    rails (= 6.0.3) was resolved to 6.0.3, which depends on
      actionpack (= 6.0.3)

Running `bundle update` will rebuild your snapshot from scratch, using only
the gems in your Gemfile, which may resolve the conflict.\
```

```ruby:Google翻訳
Bundlerはgem "actionpack"と互換性のあるバージョンを見つけることができませんでした：
   スナップショット（Gemfile.lock）：
     アクションパック（> = 6.1.4.1）

   Gemfileの場合：
     rails（= 6.0.3）は6.0.3に解決されました。
       アクションパック（= 6.0.3）

`bundle update`を実行すると、スナップショットが最初から再構築されます。
競合を解決する可能性のあるGemfile内のgem。
```

こんなエラーに変わりました。
環境がrails6.1.4.1だからでした。

```
gem install rails -v 6.0.3
```

でバージョン6.0.3をインストール。

立ち上げたアプリ内でrailsのバージョンを変えられるのかもしれませんが、初期も初期なのでアプリを削除し

```
rails _6.0.3_ new hello_app
```

で作り直しました。

同様にGemfileをrailsチュートリアルのものに書き直し再度bundle install。

```
You have requested:
  listen = 3.1.5

The bundle currently has listen locked at 3.7.0.
Try running `bundle update listen`

If you are updating multiple gems in your Gemfile at once,
try passing them all to `bundle update`
```

またしてもエラー。


#やってみたこと③（失敗）

このエラーどこかでみたことある！と思い、**やってみたこと①**の記事へ戻りました。

GemfileをGemfile.lockの内容より古いバージョンを指定してインストールしようとすると発生するエラーだそうです。

どうやらこのエラー文のままbundle updateを繰り返しても堂々巡りになるだけなようなので、記事に書いてあるとおり、Gemfile.lockを削除してまたbundle install

```
Bundler found conflicting requirements for the Ruby version:
  In Gemfile:
    Ruby

    capybara (= 3.28.0) was resolved to 3.28.0, which depends on
      Ruby (>= 2.4.0)

    listen (= 3.1.5) was resolved to 3.1.5, which depends on
      Ruby (>= 2.2.3, ~> 2.2)

    puma (= 4.3.6) was resolved to 4.3.6, which depends on
      Ruby (>= 2.2)

    rails (= 6.0.3) was resolved to 6.0.3, which depends on
      Ruby (>= 2.5.0)

    selenium-webdriver (= 3.142.4) was resolved to 3.142.4, which depends on
      Ruby (>= 2.3)
```

```ruby:Google翻訳
依存関係の解決...
Bundlerは、Rubyバージョンの要件が競合していることを発見しました。
   Gemfileの場合：
     ルビー

     capybara（= 3.28.0）は3.28.0に解決されました。
       Ruby（> = 2.4.0）

     listen（= 3.1.5）は3.1.5に解決されました。
       Ruby（> = 2.2.3、〜> 2.2）

     puma（= 4.3.6）は4.3.6に解決されました。
       ルビー（> = 2.2）

     rails（= 6.0.3）は6.0.3に解決されました。
       Ruby（> = 2.5.0）

     selenium-webdriver（= 3.142.4）は3.142.4に解決されました。
       Ruby（> = 2.3）
```

rubyのバージョンが3.0.2なのでrailsチュートリアルと同じく

```
% rbenv versions
  system
  2.7.3
  3.0.1
* 3.0.2 (set by /Users/moco/rails/rails-tutorial/hello_app/.ruby-version)
```

```
% rbenv local system
```

```
% rbenv versions
* system (set by /Users/moco/rails/rails-tutorial/hello_app/.ruby-version)
  2.7.3
  3.0.1
  3.0.2
```

```
% ruby -v
ruby 2.6.3p62 (2019-04-16 revision 67580) [universal.arm64e-darwin20]
```

でRubyのバージョンを2.6.3にしました。


できたーーーーーーー！！！！！！！！

と思いrails sをしたところ

```
'require': cannot load such file -- nokogiri/nokogiri (LoadError)
```

またしてもか、、、、、、

#再チャレンジ！（成功）

うまくいかないのは何かのバージョンが悪いのでは…？
と思い、色々みていたところ、愛読書(?)チェリー本こと「プロを目指すためのRuby入門」に
なるべく最新のものを利用するようにと書いてありましたので（詳しい理由等はチェリー本をお読みください）rails チュートリアルに合わせず最新のものを利用して学習を進めていくことにしました。


nokogiriエラー防止のため、意味があるかは分かりませんが、
やってみた②
の

```
% gem install nokogiri -- --use-system-libraries
```

を実行。

そしてまた

```
% rails new hello_app
```

で新しいアプリを作り直しました。

```
% rails s
```

でサーバーが起動することを確認。

Gemfileをいじらずに

```
% bundle install
```

→成功！

railsチュートリアルと同じgemをインストールしたいけど一つずつ確認していこうと思い（今思えばエラーメッセージでダメなところ出てくるのに）、変更を一つ加えるごとにbundle installしました。

developmentの

```
gem 'spring-watcher-listen'
```

を追加したところでエラーが出ました。

```
Resolving dependencies...
Bundler could not find compatible versions for gem "spring":
  In snapshot (Gemfile.lock):
    spring (= 3.0.0)

  In Gemfile:
    spring (~> 3.0)

    spring-watcher-listen (~> 2.0, >= 2.0.1) was resolved to 2.0.1, which depends on
      spring (< 3.0, >= 1.2)

Running `bundle update` will rebuild your snapshot from scratch, using only
the gems in your Gemfile, which may resolve the conflict.
```

```ruby:Google翻訳
Bundlerはgem "spring"と互換性のあるバージョンを見つけることができませんでした：
   スナップショット（Gemfile.lock）：
     春（= 3.0.0）

   Gemfileの場合：
     春（〜> 3.0）

     spring-watcher-listen（〜> 2.0、> = 2.0.1）は2.0.1に解決されました。
       春（<3.0、> = 1.2）

`bundle update`を実行すると、スナップショットが最初から再構築されます。
競合を解決する可能性のあるGemfile内のgem。
```

何かバージョンがあっていないのだと思い、検索すると

https://blog.mothule.com/ruby/rails/ruby-rails-update-rails-version

参考にできそうな記事を見つけました。

このエラー内容としては、
**spring-watcher-listenはspringに依存していて、springのバージョンは3.0~3.9のどれか。
でもpring-watcher-listenを2.0~2.0.1で使うにはspringのバージョンは1.2~2.9のどれかじゃないといけない**
ということのようです。

```Gemfile:Gemfile
group :development do
  gem 'web-console', '>= 4.1.0'
  gem 'listen', '~> 3.3'
  gem 'spring'
  gem 'spring-watcher-listen'
end
```

と記載していたので、2021.10月現在では3.0.0がインストールされていたためspring-watcher-listenが使えなかったようです。

```Gemfile:Gemfile
group :development do
  gem 'web-console', '>= 4.1.0'
  gem 'listen', '~> 3.3'
  gem 'spring', '~> 2.0' #バージョンを指定
  gem 'spring-watcher-listen'
end
```
そして

```
% bundle install
```

で成功！！！！！！！！！！

```
% rails s
```

も無事起動しました。


#まとめ

環境とバージョンの大切さを身に沁みて感じました。

私の環境では

```
% uname -m
arm64
```

ですが、Cloud9では

```
% uname -m
x86_64
```

でした。

railsチュートリアルはCloud9をベースに作られているようですのでローカル環境で試みている方には注意が必要かもしれません。

また、環境に応じた適切なバージョン指定も必要であると感じました。
（そしてちゃんとエラーログを読もうと思いました）
今後もこのようなことでたくさんのエラーに遭遇するかと思いますが「熟練」目指して頑張りましょう。