railsチュートリアルの2周目さあ頑張ろう…!と意気込んでいたのですが、
「ゼロからデプロイまで」で躓きました。
#経緯
私はこのエラー、遭遇は2回目です。(1回目は諦めました)
1回目は、railsチュートリアルを進めていく上でcloud9の容量がなくなって、一度git cloneでローカル環境に取り込んだ時です。
rails serverの時にnokogiriエラーが出ました。
私の当時の力じゃどう頑張っても解決しそうになかったので、Cloud9の容量を無料最大まで上げた環境を新たに作り、そこにgit cloneをして学習を続けました。
1周では技術が自分のものになった気がしなかったので、2周目はローカル環境で進めてみようと思い再度nokogiriエラーと戦うことになりました。
#nokogiriエラーについて
railsを勉強する上でいろんな方が遭遇しているようです。
私が遭遇したエラーは、追い切れないほどのたくさんのlogの最後に
'require':cannot load such file -- nokogiri/nokogiri (LoadError)
と出るものでしたが、調べたところ色々なエラーがあるそうです。
上記のエラー以外のnokogiriエラーに関しては
こちらの記事が参考になりそうです。
#筆者の環境
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の検索ワードを入れて調べるようにしてみるとヒントを手に入れられるかもしれません。
こちらの記事少し理解できました。
たくさんの記事を参考にする上で困難もあるかと思いますが私は一旦ARMアーキテクチャで進めてみようと思います。
なお、今回はbundle installをした上でrails sが起動することを成功とします。
#やってみたこと①(失敗)
https://qiita.com/java74717470/items/40678916e5f386e3866e
なんでかは分かりませんがうまくいきませんでした。
#やってみたこと②(失敗)
こちらで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.\
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)
依存関係の解決...
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.
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。
何かバージョンがあっていないのだと思い、検索すると
参考にできそうな記事を見つけました。
このエラー内容としては、
spring-watcher-listenはspringに依存していて、springのバージョンは3.0~3.9のどれか。
でもpring-watcher-listenを2.0~2.0.1で使うにはspringのバージョンは1.2~2.9のどれかじゃないといけない
ということのようです。
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が使えなかったようです。
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をベースに作られているようですのでローカル環境で試みている方には注意が必要かもしれません。
また、環境に応じた適切なバージョン指定も必要であると感じました。
(そしてちゃんとエラーログを読もうと思いました)
今後もこのようなことでたくさんのエラーに遭遇するかと思いますが「熟練」目指して頑張りましょう。