Electron:rpmで複数のアプリケーションをインストールすると競合する
Electron では、依存するライブラリや実行ファイルを rpm パッケージ作成時に自分のアプリケーションインストールフォルダ (に全部入れてしまう。(これ自体は外部依存性をなくすために有効な手段)
複数のアプリケーションで同じ共有ライブラリや実行ファイルを使うと、同じ Build IDになってしまう。
/usr/lib/.build-id の共有ライブラリや実行ファイルへのシンボリックリンクも rpm に含めるが、シンボリックリンクの名前(Build ID)は同じで指す場所がそれぞれのアプリケーション内という状態になる。
再現
Electron がビルド可能な環境になっているものとする。
(deb のビルドが無駄に長いので forge.config.js から削除した方が良い)
code:console
$ npm init electron-app@latest electron-myapp1 -- --template=webpack
$ npm init electron-app@latest electron-myapp2 -- --template=webpack
$ (cd electron-myapp1; yarn make)
$ (cd electron-myapp2; yarn make)
$ sudo rpm -i electron-myapp1/out/make/rpm/x64/electron-myapp1-1.0.0-1.x86_64.rpm
$ sudo rpm -i electron-myapp2/out/make/rpm/x64/electron-myapp2-1.0.0-1.x86_64.rpm
ファイル /usr/lib/.build-id/09/ff65463755b887e71c59f7b68228e92a84bd46 (パッケージ electron-myapp2-1.0.0-1.el9.x86_64 から) は、パッケージ electron-myapp1-1.0.0-1.el9.x86_64 からのファイルと競合しています。
ファイル /usr/lib/.build-id/15/1f079fb274bc8b986bddea21c82a6b2ce21690 (パッケージ electron-myapp2-1.0.0-1.el9.x86_64 から) は、パッケージ electron-myapp1-1.0.0-1.el9.x86_64 からのファイルと競合しています。
ファイル /usr/lib/.build-id/5e/d5f3b704e38de8222deca31e8175714b2260bb (パッケージ electron-myapp2-1.0.0-1.el9.x86_64 から) は、パッケージ electron-myapp1-1.0.0-1.el9.x86_64 からのファイルと競合しています。
ファイル /usr/lib/.build-id/78/e0e100f56ff0ac8894342351a1e880d628eabc (パッケージ electron-myapp2-1.0.0-1.el9.x86_64 から) は、パッケージ electron-myapp1-1.0.0-1.el9.x86_64 からのファイルと競合しています。
ファイル /usr/lib/.build-id/ae/738ae61b53556ed5410b97010d67864f55aea9 (パッケージ electron-myapp2-1.0.0-1.el9.x86_64 から) は、パッケージ electron-myapp1-1.0.0-1.el9.x86_64 からのファイルと競合しています。
ファイル /usr/lib/.build-id/c7/dd943c9a2f9568fcd82fa7baddb1f22f38fb22 (パッケージ electron-myapp2-1.0.0-1.el9.x86_64 から) は、パッケージ electron-myapp1-1.0.0-1.el9.x86_64 からのファイルと競合しています。
ファイル /usr/lib/.build-id/d8/4bcf3c3dd3a2b0eb74098695c3662a91f464f0 (パッケージ electron-myapp2-1.0.0-1.el9.x86_64 から) は、パッケージ electron-myapp1-1.0.0-1.el9.x86_64 からのファイルと競合しています。
ファイル /usr/lib/.build-id/f3/a26db3f1c4644e02d50fa102282631595594df (パッケージ electron-myapp2-1.0.0-1.el9.x86_64 から) は、パッケージ electron-myapp1-1.0.0-1.el9.x86_64 からのファイルと競合しています。
# 英語環境の場合
file /usr/lib/.build-id/09/ff65463755b887e71c59f7b68228e92a84bd46 from install of electron-myapp2-1.0.0-1.el9.x86_64 conflicts with file from package electron-myapp1-1.0.0-1.el9.x86_64
file /usr/lib/.build-id/15/1f079fb274bc8b986bddea21c82a6b2ce21690 from install of electron-myapp2-1.0.0-1.el9.x86_64 conflicts with file from package electron-myapp1-1.0.0-1.el9.x86_64
file /usr/lib/.build-id/5e/d5f3b704e38de8222deca31e8175714b2260bb from install of electron-myapp2-1.0.0-1.el9.x86_64 conflicts with file from package electron-myapp1-1.0.0-1.el9.x86_64
file /usr/lib/.build-id/78/e0e100f56ff0ac8894342351a1e880d628eabc from install of electron-myapp2-1.0.0-1.el9.x86_64 conflicts with file from package electron-myapp1-1.0.0-1.el9.x86_64
file /usr/lib/.build-id/ae/738ae61b53556ed5410b97010d67864f55aea9 from install of electron-myapp2-1.0.0-1.el9.x86_64 conflicts with file from package electron-myapp1-1.0.0-1.el9.x86_64
file /usr/lib/.build-id/c7/dd943c9a2f9568fcd82fa7baddb1f22f38fb22 from install of electron-myapp2-1.0.0-1.el9.x86_64 conflicts with file from package electron-myapp1-1.0.0-1.el9.x86_64
file /usr/lib/.build-id/d8/4bcf3c3dd3a2b0eb74098695c3662a91f464f0 from install of electron-myapp2-1.0.0-1.el9.x86_64 conflicts with file from package electron-myapp1-1.0.0-1.el9.x86_64
file /usr/lib/.build-id/f3/a26db3f1c4644e02d50fa102282631595594df from install of electron-myapp2-1.0.0-1.el9.x86_64 conflicts with file from package electron-myapp1-1.0.0-1.el9.x86_64
競合したファイルの中身
/usr/lib/electron-myapp1 の中を指している。
code:console
$ file /usr/lib/.build-id/09/ff65463755b887e71c59f7b68228e92a84bd46
/usr/lib/.build-id/09/ff65463755b887e71c59f7b68228e92a84bd46: symbolic link to ../../../../usr/lib/electron-myapp1/libEGL.so
$ file /usr/lib/.build-id/15/1f079fb274bc8b986bddea21c82a6b2ce21690
/usr/lib/.build-id/15/1f079fb274bc8b986bddea21c82a6b2ce21690: symbolic link to ../../../../usr/lib/electron-myapp1/libvulkan.so.1
$ file /usr/lib/.build-id/5e/d5f3b704e38de8222deca31e8175714b2260bb
/usr/lib/.build-id/5e/d5f3b704e38de8222deca31e8175714b2260bb: symbolic link to ../../../../usr/lib/electron-myapp1/electron-myapp1
$ file /usr/lib/.build-id/78/e0e100f56ff0ac8894342351a1e880d628eabc
/usr/lib/.build-id/78/e0e100f56ff0ac8894342351a1e880d628eabc: symbolic link to ../../../../usr/lib/electron-myapp1/libffmpeg.so
$ file /usr/lib/.build-id/ae/738ae61b53556ed5410b97010d67864f55aea9
/usr/lib/.build-id/ae/738ae61b53556ed5410b97010d67864f55aea9: symbolic link to ../../../../usr/lib/electron-myapp1/chrome_crashpad_handler
$ file /usr/lib/.build-id/c7/dd943c9a2f9568fcd82fa7baddb1f22f38fb22
/usr/lib/.build-id/c7/dd943c9a2f9568fcd82fa7baddb1f22f38fb22: symbolic link to ../../../../usr/lib/electron-myapp1/chrome-sandbox
$ file /usr/lib/.build-id/d8/4bcf3c3dd3a2b0eb74098695c3662a91f464f0
/usr/lib/.build-id/d8/4bcf3c3dd3a2b0eb74098695c3662a91f464f0: symbolic link to ../../../../usr/lib/electron-myapp1/libGLESv2.so
$ file /usr/lib/.build-id/f3/a26db3f1c4644e02d50fa102282631595594df
/usr/lib/.build-id/f3/a26db3f1c4644e02d50fa102282631595594df: symbolic link to ../../../../usr/lib/electron-myapp1/libvk_swiftshader.so
ここでは、まったく同じ初期ファイルからのビルドなので、electron-myapp1/electron-myapp1 も競合してしまっている。
対処方法
rpm を強制的にインストールする。
$ rpm -i --force your-app.rpm
Build ID が同じ = バイナリが同じと見なしてよいので、これでよい。
/usr/lib/.build-id は、インストール時には後勝ち。アンインストール時には先に消されてしまう。アンインストール時には要注意。(本来は競合した相手を再インストールすべき)
デバッグ情報なので通常は問題にならない模様
競合している例
参考