`ExecJS::RuntimeUnavailable` エラーは EXECJS_RUNTIME=Disabled で回避できるときがある
ExecJS::RuntimeUnavailable
で ググってもあまり出てこなかったので書いておく。
railsコマンドやrakeコマンドで、ExecJS::RuntimeUnavailable
エラーが起きてしまうことがある。
普通はあんまり起きないんだけど、railsアプリで、以下のようなケース。
- dockerのmulti-stageビルドを駆使していてダイエットしていて、最終的に出来上がるdockerイメージに
nodejs
(とか)が無い execjs
gem を利用している- 例えば、
autoprefixer-rails
gem や、それに依存してるbootstrap
(twitter bootstrap) gemを使っている
- 例えば、
( productionでbootstrap gemを使わなきゃいいだろ、と言われそうだが、bootstrap gemに依存してるgemがあってな…..😂)
回避策
nodejs
とかを入れる、のがまあ回避策になるんだけど、
環境変数 EXECJS_RUNTIME
に Disabled
を入れることで回避できることを知った。
もちろん、rake assets:precompile
とかを走らせるときはダメだと思う。
その場合は普通に nodejs
とかを入れる。
How to disable ExecJS in production: upgrade to 1.3.0 and set ENV['EXECJS_RUNTIME'] = 'Disabled' before Bundler.require
— Jon Leighton (@jonleighton) March 13, 2012
execjs gemに そういうクラスがある
Nullオブジェクトパターンってこういうパターンだっけかな