背景
あるプロジェクトで、electron-builderを使ってelectronアプリをパッケージングしています。
このプロジェクトは、訳あってNode.jsのバージョン12からすぐにはアップデートできないプロジェクトです。
macOS向けパッケージを提供するため、macOS上でパッケージングをする必要があります。
macOS Montereyにアップデートしたことで、パッケージングでエラーが発生するようになりました。
備忘録として対処方法を残します。
(本来はNode.jsのバージョンを素直に上げるべきですが、今回は現状維持のままで早急に対策をする必要がありました)
エラー内容
パッケージング中に以下のエラーが出て、dmgイメージの作成に失敗します。
(node:4561) UnhandledPromiseRejectionWarning: Error: Exit code: ENOENT. spawn /usr/bin/python ENOENT
原因
macOS Montereyでは、python2の同梱が廃止されたため、/usr/bin/pythonにはpythonがいません。
electron-builderが使用している何かのモジュールが、/usr/bin/python固定でコールしているみたい。
macOSは/usr/bin配下に書き込みができないため詰み。(SIP無効とかリスキーな方法はある)
調査して判明したこと
- Node.jsバージョン12をサポートしているelectron-builderのバージョンは22.10までである。
- electron-builderのバージョン22.11以降では、関連モジュールがNode.js標準モジュールのfs/promisesを使用している。fs/promisesはNode.jsバージョン10やバージョン14以降でサポートしているが、バージョン12では非サポートである。このため、Node.jsバージョン12 + electron-builderバージョン22.11以降の組み合わせでは動作しない。
- electron-builderのバージョン22.11から、PYTHON_PATH環境変数をサポートしている。この変数によって、これまで/usr/bin/python固定だったパスを任意に指定できる。
どうなればいいのか
- electron-builderバージョン22.11以降をNode.jsバージョン12で動作するようにする
- python2をインストールして、PYTHON_PATH環境変数にパスを通す。
electron-builderバージョン22.11以降をNode.jsバージョン12で動作させるには
これだけわかれば、暫定的な対処ができます。
fs/promisesモジュールはエイリアスであり、
require("fs/promises");
と
require("fs").promises;
は同義です。
そして、fsモジュールはNode.jsバージョン12でも問題なく使用できます。
よって、すべて置換してあげることで解決します。
electron-builderのバージョンを22.11.11にアップデートします。
node_modules/ディレクトリ内の
require("fs/promises");
を検索して、すべて
require("fs").promises;
に置換します。
あとは、Python2をインストールして、PYTHON_PATH環境変数を設定すれば解決です。
後記
疲れました。
今回はあくまで暫定的な対処であって、ちゃんとNode.jsのバージョンを上げることを検討します。