배경
회사 개발 업무 중 ZeroMQ 를 무조건 사용해야하는 상황이 생겼다.
협력사들이 다 이걸 쓰고 있다고 하니 맞춰야하는 상황이다.
대충보니 ZeroMQ는 아주 간단한 메세지 통신에 사용하기에 좋아 보였다. 사용법도 간단했다.
근데 문제는 Electron Framework에 넣고 게다가 라즈베리파이 ( arm64) 환경에서 이 앱이 돌아가야 했기에.. 실행해봤다.
하....
AJavaScript error occurred in the main process
Uncaught Exception:
Error: Failed to load zeromq.js addon.node: Error: ENOENT, node_modules/zeromq/build/linux/arm64/node not found in /tmp/.mount_TestVtatC4/resources/app.asar
Error: ENOENT, node_modules/zeromq/build/linux/arm64/node not found in /tmp/.mount_TestVtatC4/resources/app.asar
at createError (node:electron/js2c/node_init:2:2002)
at t.readdirSync (node:electron/js2c/node_init:2:13869)
at findAddon (/tmp/.mount_TestVtatC4/resources/app.asar/node_modules/zeromq/lib/load-addon.js:22:43)
at Object.<anonymous> (/tmp/.mount_TestVtatC4/resources/app.asar/node_modules/zeromq/lib/load-addon.js:50:15)
at Module._compile (node:internal/modules/cjs/loader:1484:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1564:10)
at Module.load (node:internal/modules/cjs/loader:1295:32)
at Module._load (node:internal/modules/cjs/loader:1111:12)
at c._load (node:electron/js2c/node_init:2:16955)
at Module.require (node:internal/modules/cjs/loader:1318:19)
at findAddon (/tmp/.mount_TestVtatC4/resources/app.asar/node_modules/zeromq/lib/load-addon.js:43:15)
at Object.<anonymous> (/tmp/.mount_TestVtatC4/resources/app.asar/node_modules/zeromq/lib/load-addon.js:50:15)
at Module._compile (node:internal/modules/cjs/loader:1484:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1564:10)
at Module.load (node:internal/modules/cjs/loader:1295:32)
at Module._load (node:internal/modules/cjs/loader:1111:12)
at c._load (node:electron/js2c/node_init:2:16955)
at Module.require (node:internal/modules/cjs/loader:1318:19)
at require (node:internal/modules/helpers:179:18)
at Object.<anonymous> (/tmp/.mount_TestVtatC4/resources/app.asar/node_modules/zeromq/lib/native.js:8:38)
[2220:1107/070036.348863:ERROR:ozone_platform_x11.cc(245)] Missing X server or $DISPLAY
[2220:1107/070036.349398:ERROR:env.cc(258)] The platform failed to initialize. Exiting.
이 에러가 사실... Mac (intel, Apple Silicon), Window (x64), Linux(x64) 에선 잘 나왔기에 알 수 없었는데.. 라즈베리파이에서만 저렇게 뜬다..
이슈 원인
node_module/zeromq 를 봤다.
빌어먹을 zeroMQ.js 에서 리눅스 ARM64용 addon.node 파일을 아예 생성조차 하지 않았다.
기존 것들도 prebuild 해준거라 사실 고마운건 알지만... ㅜㅜ 아쉽네..
알아서 빌드해야하는 상황이다.
package.json 에 있는 build 스크립트를 돌리면 현 본인의 네이티브 아키텍쳐와 os 기반으로 생성된다. ( cmake-ts )
VM 우분투 (Arm64) 용이 이럴때 사용되야지...
시도
VM이든 도커든 뭐든 켜서 해당 zeromq (node_modules 에 있는) 패키지를 넣어놓고 직접 빌드한 뒤, addon.node 파일을 별도로 넣어줘야한다.
아래 압축파일을 해제하면 node_modules에 있는거랑 같다. ( 2024.11.07 자 )
# arm64 용 OS에서 진행
# 사전설치 : node.js ( ... 이건 알아서 검색 ... )
sudo npm install -g npm-run-all
Sudo nom install -g yarn
sudo apt install ninja-build
sudo apt install g++
sudo apt install build-essential
# package.json 수정
"cmake-ts" 안쪽 configurations 안에 아래 항목 추가
==================================================
{
"name": "linux-arm64-electron",
"os": "linux",
"arch": "arm64",
"runtime": "electron",
"runtimeVersion": "12.22.12"
},
==================================================
echo "export VCPKG_FORCE_SYSTEM_BINARIES=1" >> ~/.bashrc
source ~/.bashrc
yarn install
# 빌드 시작 (yarn 으로 하든 pnpm으로 하든 npm 으로 하든 실행)
yarn run build
이후
라즈베리파이는 뒷 버전은 안따지는 것 같으니 일단 arm64/node/addon.node 로 넣어줬다.
결과는 실패.. 에러메세지는 바뀌었는데 addon.node 가 호환되지 않는다고 뜬다.
같은 Arm 아키텍쳐의 CPU라고 생각하고 했는데, 애플실리콘이랑 브로드컴CPU랑은 다를거라곤 생각했지만 역시나 안됐다.
해결
결국 라즈베리파이5 내에서 직접 빌드하여 실행하니 성공..
/node_module/zeromq/linux/arm64/node 에 넣어주고 패키징하니 잘 된다.
'자바스크립트 > Electron Framework' 카테고리의 다른 글
Electron Builder 로 빌드 시 cannot be closed. Please close it manually and click ret (2) | 2024.10.10 |
---|---|
Electron Framework + ESM + TypeScript 환경 세팅 (0) | 2024.01.31 |
[Window] Electron Builder 실행시 cannot create symbolic link 이슈 (4) | 2024.01.31 |
Electron 클라이언트 중복 실행 방지 방법 (0) | 2023.10.06 |