クソ悩んだ
https://drroot.page/wp/?p=201
この記事は、上記記事の続きだ。
概要と症状
2021年1月末現在、こんな感じで再現できる。
vue-cli-pluginでプロジェクト作成
↓
vue add electron-builderコマンドでElectron-builderブチ込む
↓
yarnなりnpmなりでserialportを入れる(というか、ネイティブ向けパッケージを入れる)
↓
electron:serveすると普通に動く
↓
electron:buildしたexeを実行しても即座に終了してなんも起きない
↓
気づいたらelectron:serveも即終了するようになってる
エラーコードも何も起きず、正常終了するフリして即落ちするからマジで何かと思った。
原因
electron-builderが、buildコマンド時にネイティブパッケージを変なふうにリビルドするのが原因。
どうもこの時おかしなリビルドをするらしく、起動後即座にbindings(ネイティブバイナリと橋渡しするやつ)を掴み損なって落ちるらしい。
これもビルド時のログを5千億回くらい読み直してようやく理解できたんだが、どうも「electron-rebuild -f -w serialport」すべきところを「npm-rebuild」してるらしく…
もしかしたら、electronにバンドルするnodeではなく、開発で使ってるnpm向けにビルドしちゃってるんじゃないだろうか。
直し方
electron-builderに、ビルド時の余計なネイティブパッケのリビルドやめろと伝えれば良い。
ドキュメントによれば、npmRebuildをfalseにすればいいとある。
https://www.electron.build/configuration/configuration#configuration
electron+vue構成の場合、プロジェクトのルートにvue.config.jsを作り、そこにbuilderへ渡すオプションを書ける。
https://nklayman.github.io/vue-cli-plugin-electron-builder/guide/configuration.html#configuring-electron-builder
今回はserialportを使っているので、こいつをビルドから除外するコードも含めると(前回記事参照)こんな感じだ。
module.exports = {
pluginOptions: {
electronBuilder: {
externals: ["serialport"],
builderOptions: {
npmRebuild: false
}
}
}
};
で、もしこの症状に陥った場合、既にBuilderがゴミをリビルドしてしまっているので、もっかい手動でネイティブバイナリのリビルドをする必要がある。
即ち、「electron-rebuild -f -w serialport」を叩き直せばいい…このあたりは前回記事の内容を参照だ。
ちなみに
yarnを使ってるだけでも、何かしらaddした時この余計なリビルド処理が発生しやがるぞ。どうしろってんだ。
今の所気付き次第Rebuildする以外に思いつかんね。