【Ruby/Rails】Rails5.2.2/MySQL8.0でmysql2のインストールに失敗する

2018年12月31日Ruby

こんにちは、しきゆらです。

今回は、タイトル通りmysql2のインストールに失敗したのをなんとかする方法をメモしておきます。

環境としては、

  • Mac
  • Ruby2.6.0
  • Rails5.2.2
  • MySQL8.0.13

という状態。

普通にbundle installすると、エラーが。

Fetching mysql2 0.5.2
Installing mysql2 0.5.2 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /Users/user_name/path/to/vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.2/ext/mysql2
/usr/local/Ruby/bin/ruby -I /usr/local/Ruby/lib/ruby/2.6.0 -r ./siteconf20181231-27997-6j2jh2.rb extconf.rb
--with-ldflags\=-L/usr/local/opt/openssl/lib\ --with-cppflags\=-I/usr/local/opt/openssl/include
checking for rb_absint_size()... *** 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=/usr/local/Ruby/bin/$(RUBY_BASE_NAME)
/usr/local/Ruby/lib/ruby/2.6.0/mkmf.rb:467:in `try_do': The compiler failed to generate an executable file. (RuntimeError)
You have to install development tools first.
    from /usr/local/Ruby/lib/ruby/2.6.0/mkmf.rb:552:in `try_link0'
    from /usr/local/Ruby/lib/ruby/2.6.0/mkmf.rb:570:in `try_link'
    from /usr/local/Ruby/lib/ruby/2.6.0/mkmf.rb:782:in `try_func'
    from /usr/local/Ruby/lib/ruby/2.6.0/mkmf.rb:1069:in `block in have_func'
    from /usr/local/Ruby/lib/ruby/2.6.0/mkmf.rb:959:in `block in checking_for'
    from /usr/local/Ruby/lib/ruby/2.6.0/mkmf.rb:361:in `block (2 levels) in postpone'
    from /usr/local/Ruby/lib/ruby/2.6.0/mkmf.rb:331:in `open'
    from /usr/local/Ruby/lib/ruby/2.6.0/mkmf.rb:361:in `block in postpone'
    from /usr/local/Ruby/lib/ruby/2.6.0/mkmf.rb:331:in `open'
    from /usr/local/Ruby/lib/ruby/2.6.0/mkmf.rb:357:in `postpone'
    from /usr/local/Ruby/lib/ruby/2.6.0/mkmf.rb:958:in `checking_for'
    from /usr/local/Ruby/lib/ruby/2.6.0/mkmf.rb:1068:in `have_func'
    from extconf.rb:25:in `<main>'

To see why this extension failed to compile, please check the mkmf.log which can be found here:

/Users/user_name/path/to/vendor/bundle/ruby/2.6.0/extensions/x86_64-darwin-18/2.6.0-static/mysql2-0.5.2/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in
/Users/user_name/path/to/vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.2 for inspection.
Results logged to
/Users/user_name/path/to/vendor/bundle/ruby/2.6.0/extensions/x86_64-darwin-18/2.6.0-static/mysql2-0.5.2/gem_make.out

An error occurred while installing mysql2 (0.5.2), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.5.2' --source 'https://rubygems.org/'` succeeds before bundling.

In Gemfile:
  mysql2

mysql2のインストールに失敗したようです。

調べてみると、以下のような解決方法がいくつも提示されていました。

以下のコードを打ち込む。

bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include

RailsにMySQLを導入したらかなりハマった件について – 大学生Webエンジニアの記録

調べてみると、どうやらbundlerにはgemをビルドするときにフラグやオプションを渡すことができる機能を持っているようです。

上記コードは、mysql2のビルドオプションを渡すコードのようです。

Build Options

You can use bundle config to give Bundler the flags to pass to the gem installer every time bundler tries to install a particular gem.

bundle config build.mysql --with-mysql-config=/usr/local/mysql/bin/mysql_config

Bundler: bundle config – Bundler Docs

似たコードが書かれています。

オプションを追加し、再びbundle install。

・・・エラー直らず。

途方に暮れていると、こんな情報が。

ログ見たら –with-cppflags オプションに対応してないとのこと。
ldflagsのみで実行してみる

bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib"

mysqlのbundle installに失敗する – Qiita

なんと、cppflagsはいらないようです。

実際、上記の設定後にbundle install すると問題なくインストールできました。

$ bundle install
...
Fetching mysql2 0.5.2
Installing mysql2 0.5.2 with native extensions
Fetching pry 0.12.2
...

先人たちの体験談には頭が上がりません。

感謝です。

今回はここまで。

おわり

Posted by しきゆら