`ExecJS::RuntimeUnavailable` エラーは EXECJS_RUNTIME=Disabled で回避できるときがある
ExecJS::RuntimeUnavailable で ググってもあまり出てこなかったので書いておく。
railsコマンドやrakeコマンドで、ExecJS::RuntimeUnavailable エラーが起きてしまうことがある。
普通はあんまり起きないんだけど、railsアプリで、以下のようなケース。
- dockerのmulti-stageビルドを駆使していてダイエットしていて、最終的に出来上がるdockerイメージに
nodejs(とか)が無い execjsgem を利用している- 例えば、
autoprefixer-railsgem や、それに依存してる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オブジェクトパターンってこういうパターンだっけかな