自分にやさしく学ぶプログラミング

プログラミング学習記録、備忘録

capistranoでデプロイしようとしたら"The engine "node" is incompatible with this module."と怒られて止まった

タイトルの通りですが、cap production deployしたらnodeがincompatibleだと怒られてデプロイできないという現象が発生しました。

実行環境

参考リンク

実際に表示されたメッセージ

00:08 deploy:assets:precompile
      01 /home/yuta/.rbenv/bin/rbenv exec bundle exec rake assets:precompile
      01 yarn install v1.21.1
      01 warning package-lock.json found. Your project contains lock files generated by tools other than Yarn. It is advised not to mix pack…
      01 [1/4] Resolving packages...
      01 [2/4] Fetching packages...

(中略)

error browserslist@4.14.0: The engine "node" is incompatible with this module. Expected version "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7". Got "13.3.0"
error Found incompatible module.
(Backtrace restricted to imported tasks)
cap aborted!

(後略)

解決に至る流れ

デプロイ先の環境でバージョン確認してみると14.0.0でした。

$ node -v
v14.0.0

エラーメッセージと合わないので、which -a nodeしてみたところ、nvmの他にsystemにもnodeがインストールされていました。 (ていうかここで確認するまでnvm使っていること自体忘れていた・・・)

$ which -a node
/home/yuta/.nvm/versions/node/v14.0.0/bin/node
/usr/bin/node

そこで/usr/bin/node -vしてみたところ

$ /usr/bin/node -v
v13.3.0

案の定、デプロイ時はnvmを経由せずsystemの方のnodeを参照してしまっているようです。
多分/usr/bin/nodeはもう使わないので、アンインストールしておきました。

$ sudo rm -rf /usr/bin/node

さらに、どうもnvmを使う場合はcapistrano-nvmを入れた方が良さそうなのでGemfileに追加。

  gem "capistrano-nvm", require: false

これによりconfig/deploy.rbにnvm関連の値が設定できるので、下記のように追記しました。

set :nvm_type, :user
set :nvm_node, "v14.0.0"
set :nvm_map_bins, %w{npm node yarn rake} # ここにrakeを入れるのがポイント

基本capistrano-nvmのreadmeにある例そのままですが、自分の場合はnvm_map_binsにrakeを含める必要がありました。

この状態でcap production deployしたところ、無事最後まで完了しました!
めでたしめでたし。