Programming Field

[Web] ElectronのexeビルドにWineは不要になった

ブログ的な記事です。Electronをパッケージ化する際、Windows向けのバイナリ(exe)を生成するために非Windows環境だとWineを導入する必要がありました。しかし「@electron/packager」のバージョン v18.12.0 以降、この制限は撤廃され、Wineをインストールする必要はなくなりました。READMEでも、以前は存在していた「Building Windows apps from non-Windows platforms」というセクションも無くなっています。

※ 既存のプロジェクトで適用する場合、package-lock.json の再構築をするなどで @electron/packager が最新版になるように調整する必要があります。

なぜWineが必要だったのか

Electronはパッケージングする際、各OSに沿ったバイナリを用意し、必要に応じてそのバイナリのアイコンやバージョン情報などを差し替えます。Windows向けの場合は差し替えのためにexeファイルのリソースデータを直接編集しています。

従来のパッケージャーでは、Windowsのexeバイナリを書き換えるために「rcedit」(node-rcedit)を使用していました。このパッケージは内部でexeファイルを呼び出しており、この実行のために非Windows環境ではWineが必要となっていました。

※ その内部で呼び出しているexeファイルは、リソースデータを書き換えることができるWin32APIを利用して書き換えを行っています。参考: https://github.com/electron/rcedit

reseditの導入によるクロスプラットフォーム化

Electronチームは、「feat: remove dependency on rcedit to allow x-platform exe resource modding」というPull Requestによって、「rcedit」への依存を無くしました。理由として「プラットフォーム別パッケージングの制約の撤廃」や「将来的にWindows向けのASAR整合性を導入するための準備」が挙げられています。代わりに使用することになったのが「resedit」パッケージです。

「resedit」は自分が作成したパッケージで、Windowsのバイナリの操作をJS(TS)のみで実装したパッケージになります(厳密にはコアな部分は「pe-library」パッケージに分割しています)。すべてJSのみで記述されているため非Windows環境でも動作することと、他に依存パッケージが存在しないことが特徴です。(余談ですが、Node.js APIにも非依存なのでWebでも動作します。)

上記のPRは「@electron/packager」の v18.2.0 に取り込まれており、これ以降のパッケージャーではWineを必要することが無くなっています。

まとめ

  • Electronのexe作成処理ではアイコンやバージョン情報をセットするためにexeバイナリの書き換えを行っています。
  • 従来はexeバイナリの書き換えにWindowsで実装したexeプログラムを使っていたためWineが必要でした。
  • 最新のパッケージャーではJSのみで書かれたexeバイナリの書き換えを行うパッケージの利用により、Wineが不要になりました。