electron-forgeでmacOSからwindows向けのビルド(クロスコンパイル)を行う。
要約
electron-forgeのデフォルトコマンドでは、makeやpackageは使用している端末依存。- コマンド末尾で
--archや--platformを指定して、変更することができる。 - 指定できるアーキテクチャとプラットフォームは、最下部の参考を参照のこと。
デフォルトのyarn packageやyarn makeでは無理
electron-forgeで作るとデフォルトで、yarn packageやyarn makeが準備されているが、これを実行しても使用している環境のファイルしか出来上がらない。
せっかく作ったなら、windowsくらい対応したいものだ。
そこで色々試してみて、とりあえず出来たのでメモを残しておく。
まずは、packageから
makeすればpackageも行われるので、必要ないかもしれないが、こちらは簡単にクロスコンパイルできた。
単純に、オプションを追加するだけ、allで全てのアーキテクチャとプラットフォームの組み合わせでビルドできる。
{
...
"scripts": {
...
"package": "electron-forge package",
"package:all": "electron-forge package --arch=all --platform=all",
},
}
上記のように--archと--platformにallを指定するだけ。
しかし、結構な確率でパッケージングが途中で止まってしまう。確認すると、どれも一応完了しているようで原因がよくわからないので放置しておく…
makeは面倒
makeでは、--archと--platformでallが指定できない。そのため明確に指定する必要がある。
package:allのようにできないので、シェルで指定してもいいかもしれない。
$ yarn make --arch x64 --platform win32
$ yarn make --arch x64 --platform darwin
$ yarn make --arch arm64 --platform win32
などのように指定すればOK。
しかし、macOSでwindows向けをコンパイルすると、
✖ Making for target: squirrel - On platform: win32 - For arch: x64
An unhandled error has occurred inside Forge:
An error occured while making for target: squirrel
spawn mono ENOENT
Error: spawn mono ENOENT
このようなエラーが出ることがある。これは、mono(Mono - WineHQ Wiki)という.NET frameworkのクロスプラットフォーム実装がないため。
electron-forgeの公式ドキュメント(Squirrel.Windows - Electron Forge)を見ると、
Squirrel.Windows is a no-prompt, no-hassle, no-admin method of installingWindows applications and is therefore the most user friendly you can get. You can only build the Squirrel.Windows target on a Windows machine or on a macOS /Linux machine with mono and wine installed.
このように書いてある。実際Squirrelなアプリをwindowsで実行すると、setupファイルからインストールのプロンプト画面を挟まずに、アプリのメイン画面が表示された。便利だが、2度目以降はsetupファイルは不要になることをユーザーに知らせる必要があるような気もする。
また引用にもある通り、macOS/Linuxマシンでは、monoとwineが必要になる。
今回のコンパイル環境は、macOSなので、
$ brew install wine mono
でコンパイル準備は整えられる。自分の場合は、monoが足りなかったのでそれだけ追加インストールした。
環境ごとにpackage.jsonのscriptsに指定すればいいかなと思う。
参考
electron-forgeはpackageで内部的にelectron-packagerを使っているので、そのドキュメントが参考にできる。
- 指定可能な
archとplatform
以上。


