はじめに
EC2インスタンス上のマシンでbundle install実行時にcan't find header files
エラー。解決した方法をメモとして残す。
環境
- EC2インスタンス
- ubuntu 18.04LTS
- ruby 2.5.1
bundle install時のエラー
$ bundle install --path .bundle
[DEPRECATED] The `--path` flag is deprecated because it relies on being remembered across bundler inv
ocations, which bundler will no longer do in future versions. Instead please use `bundle config set p
ath '.bundle'`, and stop using this flag
Fetching gem metadata from https://rubygems.org/.......
Using bundler 2.1.4
Using multipart-post 2.1.1
Using ruby2_keywords 0.0.2
Using faraday 1.1.0
Using faraday_middleware 1.0.0
Using gli 2.19.2
Using hashie 4.1.0
Using websocket-extensions 0.1.5
Fetching websocket-driver 0.7.3
Installing websocket-driver 0.7.3 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
current directory:
/home/ubuntu/slack_bots/.bundle/ruby/2.5.0/gems/websocket-driver-0.7.3/ext/websocket-driver
/usr/bin/ruby2.5 -r ./siteconf20201215-14622-s23dju.rb extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h
extconf failed, exit code 1
Gem files will remain installed in
/home/ubuntu/slack_bots/.bundle/ruby/2.5.0/gems/websocket-driver-0.7.3 for inspection.
Results logged to
/home/ubuntu/slack_bots/.bundle/ruby/2.5.0/extensions/x86_64-linux/2.5.0/websocket-driver-0.7.3/gem_make.out
An error occurred while installing websocket-driver (0.7.3), and Bundler cannot continue.
Make sure that `gem install websocket-driver -v '0.7.3' --source 'https://rubygems.org/'` succeeds
before bundling.
In Gemfile:
slack-ruby-client was resolved to 0.15.1, which depends on
websocket-driver
websocket-driver (0.7.3)
というgemをインストール時にエラーになった模様。
メッセージに表示されているようにgem install websocket-driver -v '0.7.3' --source 'https://rubygems.org/'
を単体で実行してみたところ、今度は以下のようなエラーが発生。
$ sudo gem install websocket-driver -v '0.7.3' --source 'https://rubygems.org/'
Building native extensions. This could take a while...
ERROR: Error installing websocket-driver:
ERROR: Failed to build gem native extension.
current directory: /var/lib/gems/2.5.0/gems/websocket-driver-0.7.3/ext/websocket-driver
/usr/bin/ruby2.5 -r ./siteconf20201215-14722-9uc5to.rb extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h
extconf failed, exit code 1
Gem files will remain installed in /var/lib/gems/2.5.0/gems/websocket-driver-0.7.3 for inspection.
Results logged to /var/lib/gems/2.5.0/extensions/x86_64-linux/2.5.0/websocket-driver-0.7.3/gem_make.out
メッセージmkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h
にあるようにruby用のヘッダファイルが見つからないのが原因のよう。
自分では解決策がわからなかったので素直にエラーメッセージでぐぐったら、同じような問題に遭遇している方がいらっしゃったので参考にさせてもらった。
解決方法
自身の使っているrubyのバージョンに合わせたruby-dev
をインストールすることで解決。
今回はruby2.5
だったのでruby2.5-dev
をインストール。
$ sudo apt install ruby2.5-dev
その後bundle install
を実行するとできた。
$ bundle install --path .bundle
[DEPRECATED] The `--path` flag is deprecated because it relies on being remembered across bundler invocations, which bundler will no longer do in future versions. Instead please use `bundle config set path '.bundle'`, and stop using this flag
Fetching gem metadata from https://rubygems.org/.......
Using bundler 2.1.4
Using multipart-post 2.1.1
Using ruby2_keywords 0.0.2
Using faraday 1.1.0
Using faraday_middleware 1.0.0
Using gli 2.19.2
Using hashie 4.1.0
Using websocket-extensions 0.1.5
Fetching websocket-driver 0.7.3
Installing websocket-driver 0.7.3 with native extensions
Fetching slack-ruby-client 0.15.1
Installing slack-ruby-client 0.15.1
Bundle complete! 1 Gemfile dependency, 10 gems now installed.
Bundled gems are installed into `./.bundle`
おわりに
gemのインストール時に表示されるwith native extensions
っていうのは、そのgemがc言語のライブラリに依存していて別途コンパイルが必要だということ。今回はwebsocket-driver
をコンパイルするためのライブラリがマシンにインストールされていなかった。