LoginSignup
0
0

More than 1 year has passed since last update.

macOS Monterey + Node.js12 + electron-builderでelectronをパッケージングする方法

Last updated at Posted at 2022-10-06

背景

あるプロジェクトで、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のバージョンを上げることを検討します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0