railsのDBをdevelopment, production環境共にMySQLに変えるため
Gemfileにmysql2を記述してbundle installしたらエラーが出たので色々調べてみた。
環境
・Rails 6.0.3
・Ubuntu 18.04
・MySQL 8.0.25
エラー内容
$ bundle install
The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
.
.
.
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
current directory: /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/mysql2-0.5.3/ext/mysql2
/home/ubuntu/.rvm/rubies/ruby-2.6.3/bin/ruby -I /home/ubuntu/.rvm/rubies/ruby-2.6.3/lib/ruby/2.6.0 -r ./siteconf20210512-4404-8ubcpu.rb extconf.rb
checking for rb_absint_size()... yes
checking for rb_absint_singlebit_p()... yes
checking for rb_wait_for_single_fd()... yes
checking for -lmysqlclient... no
-----
mysql client is missing. You may need to 'sudo apt-get install libmariadb-dev', 'sudo apt-get install libmysqlclient-dev' or 'sudo yum install mysql-devel',
and try again.
-----
*** 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=/home/ubuntu/.rvm/rubies/ruby-2.6.3/bin/$(RUBY_BASE_NAME)
--with-mysql-dir
--without-mysql-dir
--with-mysql-include
--without-mysql-include=${mysql-dir}/include
--with-mysql-lib
--without-mysql-lib=${mysql-dir}/lib
--with-mysql-config
--without-mysql-config
--with-mysql-dir
--without-mysql-dir
--with-mysql-include
--without-mysql-include=${mysql-dir}/include
--with-mysql-lib
--without-mysql-lib=${mysql-dir}/lib
--with-mysqlclientlib
--without-mysqlclientlib
To see why this extension failed to compile, please check the mkmf.log which can be found here:
/home/ubuntu/.rvm/gems/ruby-2.6.3/extensions/x86_64-linux/2.6.0/mysql2-0.5.3/mkmf.log
extconf failed, exit code 1
Gem files will remain installed in /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/mysql2-0.5.3 for inspection.
Results logged to /home/ubuntu/.rvm/gems/ruby-2.6.3/extensions/x86_64-linux/2.6.0/mysql2-0.5.3/gem_make.out
An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds before bundling.
In Gemfile:
mysql2
bundle installをしてみると、上のようなエラーが出てきたので
とりあえずググってみると参考になる記事がいくつかヒットしたので
これらを参考にさせて頂き色々試してみた。
・【Rails】MySQL2がbundle installできない時の対応方法
・Cloud9でRailsプロジェクトを作成しよう
・【備忘録】ubuntuでbundle installするとmysqlでこける
やってみたこと
①LDFLAGSやCPPFLAGSの設定を変えてみる
1つ目の記事を参考に下のコードをそのまま実行して、
その後bundle installをしてみた。
$ bundle config --local build.mysql2 "--with-cppflags=-I/usr/local/opt/openssl/include"
$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib"
しかし、最初のbundle installと同じエラーメッセージが出てしまった。
おそらく1つ目の記事はmac OSの場合、有効な方法だったのかもしれない
②sudo yum install mysql-develを実行してみる
次に2つ目の記事を参考に
こちらのコードを実行してみると
$ sudo yum install mysql-devel
sudo: yum: command not found
yumコマンドが見つからないとなったので、
これについても色々と調べると
それっぽいコマンドが見つかったが
そもそもyumはRedhat系のlinuxで使われるパッケージ管理システムで
Debian系のubuntuではaptやapt-getを使うのが普通なので
apt-getで解決できる方法を探すことにした。
③sudo apt-get install libmariadb-dev と libmysqlclient-devを実行してみる
3つ目の記事では
$ sudo apt install libmysqlclient-dev
というコマンドが用いられていたが
Ubuntuのバージョンが違かったので
これを参考にしつつ最初のエラーメッセージにあったヒントを用いることにした。
用いたエラーメッセージを抜粋
-----
mysql client is missing. You may need to 'sudo apt-get install libmariadb-dev', 'sudo apt-get install libmysqlclient-dev' or 'sudo yum install mysql-devel',
and try again.
-----
このメッセージには3つのコマンドが書いてあり
3つ目は既に試してある。
残った2つを見てみると参考にした記事にあったコードと似たものがあった。
apt-getから始まるコマンド2つ or yumから始まるコマンド
を実行してみる必要があるとのことだったので
そこで
2つのコマンドを試してみることにした。
$ sudo apt-get install libmariadb-dev
Reading package lists... Done
Building dependency tree
Reading state information... Done
.
.
.
(たくさんコードがあって)
.
.
.
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
Processing triggers for libc-bin (2.27-3ubuntu1.4) ...
$ sudo apt-get install libmysqlclient-dev
Reading package lists... Done
Building dependency tree
Reading state information... Done
.
.
.
(たくさんコードがあって)
.
.
.
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
Processing triggers for libc-bin (2.27-3ubuntu1.4) ...
特にエラーメッセージは発生せず
「これは行けそう!」と思いながら
そのままbundle installを実行
$ bundle install
(色々コードが出てきて)
.
.
.
Bundle complete! 17 Gemfile dependencies, 76 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
「いけたー!」
これにて無事にインストールができた。
#結論
Ubuntu18.04の場合は
$ sudo apt-get install libmariadb-dev
$ sudo apt-get install libmysqlclient-dev
を実行すればbundle installができるようになる。
とりあえず解決はできたが
yumやapt-getの知識が全然ないので調べておく必要があるなと思った。
余談
-----
mysql client is missing. You may need to 'sudo apt-get install libmariadb-dev', 'sudo apt-get install libmysqlclient-dev' or 'sudo yum install mysql-devel',
and try again.
-----
最初にこのエラーメッセージを「どれか1つ選んで実行すれば良い」と勘違いして
$ sudo apt-get install libmysqlclient-dev
だけを実行してしまい
$ bundle exec rails db:create
を実行する時に
rails aborted!
LoadError: libmysqlclient.so.20: cannot open shared object file: No such file or directory - /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/mysql2-0.5.3/lib/mysql2/mysql2.so
というエラーが起きてしまったので
2つのコマンドを実行しないといけないということが分かりました。