マイグレーションファイル作成時にcannot load such file -- net/smtp (LoadError)エラー
実現したいこと
Migrationファイルを作成しようと、以下のコマンドを実行したところエラーが発生し、実行できませんでした。
$ rails g migration マイグレーションファイル名
エラーメッセージ
cannot load such file -- net/smtp (LoadError)
エラー原因
Ruby3.1で標準ライブラリからいくつかのライブラリが除外されていたことにより、マイグレーションファイル作成時に使用しようとしたnet-smtpライブラリ
が見つかりませんというエラーでした。
以下のライブラリが新たに bundled gems になりました。Bundler から利用する場合は Gemfile に明示的に指定してください。
https://www.ruby-lang.org/ja/news/2021/12/25/ruby-3-1-0-released/
Ruby 3.1では、上記のgemが標準ライブラリから除外されて、必要な際は個別にGemfileに記載してインストールする必要があります。
解決法
net-smtp
をGemfileに記載後、bundle install
コマンドでインストールをしました。
gem 'net-smtp'
その後、$ rails g migration マイグレーションファイル名
を実行し、マイグレーションファイルを再度作成しようとしたのですが、、、今度は、違うエラーが出てしまいました。
2つ目のエラーメッセージ
Cannot load database configuration: Unknown alias: default (Psych::BadAlias)
エラー原因2つ目
psychというYAML解釈用のGemの4系と3系で解釈が変わっているためです。
Rubyには標準でpsych
というYAML解釈用のGemがあります。しかし、新しいバージョンである4系からは、YAMLの解釈方法が変わったため、今まで読み込むことができていたYAMLファイルを読み込めなくなってしまったのです。
2つ目解決法
gemは、バージョンを記載しないと新しいバージョンが優先して利用されるため、3系を使いたい時はgemfileにバージョンを明示してあげます。
gem 'psych', '~> 3.1'
その後、bundle install
を実行しました。3系であれば以前と同じ解釈法が使われるため上手く読み込むことが出来ました。マイグレーションファイルも無事作成出来ました!!やったー!!
$ rails g migration マイグレーションファイル名 => Running via Spring preloader in process 77124 invoke active_record create db/migrate/マイグレーションファイル名.rb