何回やっても何回やってもmini_racerがインストールできない

概要

mini_racer の代わりにduktapeを入れた。

本文

https://github.com/rubyjs/mini_racer
mini_racer v0.2.15を使っているプロジェクトがあって、誤ってmini_racerを再インストールしてしたら v0.2.15 が入らなくなってしまった。 (ネイティブビルドのエラーメッセージむずかしい)

$ gem install mini_racer
Fetching mini_racer-0.4.0.gem
Fetching libv8-node-15.14.0.1-x86_64-linux.gem
Successfully installed libv8-node-15.14.0.1-x86_64-linux
Building native extensions. This could take a while...
ERROR:  Error installing mini_racer:
        ERROR: Failed to build gem native extension.

    current directory: /home/deploy/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/mini_racer-0.4.0/ext/mini_racer_extension
/home/deploy/.rbenv/versions/2.6.6/bin/ruby -I /home/deploy/.rbenv/versions/2.6.6/lib/ruby/site_ruby/2.6.0 -r ./siteconf20210509-17394-1jdp8s9.rb extconf.rb
checking for -lpthread... yes
creating Makefile

current directory: /home/deploy/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/mini_racer-0.4.0/ext/mini_racer_extension
make DESTDIR\= clean

current directory: /home/deploy/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/mini_racer-0.4.0/ext/mini_racer_extension
make DESTDIR\=
compiling mini_racer_extension.cc
cc1plus: warning: command line option ‘-Wimplicit-int’ is valid for C/ObjC but not for C++ [enabled by default]
In file included from /home/deploy/.rbenv/versions/2.6.6/include/ruby-2.6.0/ruby/ruby.h:29:0,
                 from /home/deploy/.rbenv/versions/2.6.6/include/ruby-2.6.0/ruby.h:33,
                 from mini_racer_extension.cc

調べると似たようなことにぶつかっている人がいた。https://qiita.com/sachiotomita/items/d8ca0ec6d27dd5139d24

この記事によると起きていることは、gccのバージョン依存とのこと。また、インストールするには各環境で rm -rf ./vendor/bundle などが必要そうだ。
こっちでは試行錯誤しているとmacではビルドできるのに、linuxでは上述のエラーが出ることがわかった。本番デプロイしたときに同じことを踏むとめんどくさすぎる( rm -rf ./vendor/bundle なんかやってられない )ので、別のjsランタイムを探すことにした。

最初はnodeを使うことを検討したけど、CIや各環境にnodeを入れて回るのはめんどいし、今のデプロイワークフロー的にバージョン差異が発生して今後死ぬと思った。
execjsが対応しているjsランタイムを見ると duktape たるものがありこれを使うようにした。

https://github.com/judofyr/duktape.rb

検証サーバで試しに gem i duktapeを実行すると成功した。いけると確信した。
でも、Gemfileに書いてgit pushをしたのだがCIでasset:precompileが失敗していた。

Duktape::ReferenceError: identifier '(function(opts, pluginOpts) {return eval(process' undefined
/home/circleci/server/vendor/bundle/ruby/2.6.0/gems/execjs-2.7.0/lib/execjs/duktape_runtime.rb:29:in `call_prop'
/home/circleci/server/vendor/bundle/ruby/2.6.0/gems/execjs-2.7.0/lib/execjs/duktape_runtime.rb:29:in `call'
/home/circleci/server/vendor/bundle/ruby/2.6.0/gems/autoprefixer-rails-9.8.4/lib/autoprefixer-rails/processor.rb:36:in `process'
/home/circleci/server/vendor/bundle/ruby/2.6.0/gems/autoprefixer-rails-9.8.4/lib/autoprefixer-rails/sprockets.rb:20:in `run'
/home/circleci/server/vendor/bundle/ruby/2.6.0/gems/autoprefixer-rails-9.8.4/lib/autoprefixer-rails/sprockets.rb:14:in `call'

起きていることは https://github.com/rails/execjs/issues/45 だった。
autoprefixer-railsduktapeに対応していないらしい。 autoprefixer-rails はもういらんでしょと思って適当にgrepしたのち、autoprefixer-railsを消した。 ようやく duktapeでassets:precompileが通った。

さよならmini_racer