🧨 "λ‘œμ»¬μ—μ„œλŠ” 잘 λ˜λŠ”λ°μš”?" Electron λ°°ν¬μ—μ„œ ν„°μ§„ exe μ‹€ν–‰ 였λ₯˜

솑연지·2025λ…„ 5μ›” 15일
0

νŠΈλŸ¬λΈ”μŠˆνŒ…

λͺ©λ‘ 보기
26/32

λ‘œμ»¬μ—μ„œλŠ” 잘 되던 Engine.exeκ°€

배포만 ν•˜λ©΄β€¦

πŸ₯Ά "μ—”μ§„ νŒŒμ΄ν”„μ— μ—°κ²°λ˜μ–΄ μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€."

Electron으둜 λ§Œλ“  λ°μŠ€ν¬νƒ‘ 앱을 .exe둜 νŒ¨ν‚€μ§•ν•΄μ„œ λ°°ν¬ν–ˆμ„ λ•Œ μžˆμ—ˆλ˜ μ‹€μ œ μ‚¬κ±΄μž…λ‹ˆλ‹€.


πŸ€” β€œλ‘œμ»¬μ—μ„œλŠ” μ™„λ²½ν–ˆλŠ”λ°β€¦β€

λΆ„λͺ… 개발 μ€‘μ—λŠ” 아무 문제 μ—†μ—ˆμŠ΅λ‹ˆλ‹€.

  • μ—”μ§„ 잘 뜨고
  • Named Pipe도 잘 λΆ™κ³ 
  • JSON 읽고 μ“°κ³  μ‚­μ œλ„ 찰떑같이 λ˜λ”λ‹ˆβ€¦

λ°°ν¬ν•˜λ©΄? κ°‘μžκΈ° 연결이 μ•ˆ λ©λ‹ˆλ‹€.


πŸ” 문제 1: asar μ•ˆμ— λ“€μ–΄κ°„ exeλŠ” λͺ» μ‹€ν–‰ν•©λ‹ˆλ‹€

μ²˜μŒμ—” μ΄λ ‡κ²Œ μ½”λ“œλ₯Ό μ§°μ—ˆμ£ .


const enginePath = path.join(__dirname, 'public', 'Engine.exe')

λ‘œμ»¬μ—μ„œλŠ” 이게 잘 μž‘λ™ν•©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ Electron Builderκ°€ 배포용으둜 λΉŒλ“œν•  λ•ŒλŠ”β€¦


C:\Users\...\resources\app.asar\public\Engine.ex

app.asar μ•ˆμ— 압좕돼버리죠.

λ¬Έμ œλŠ” 이 μƒνƒœμ—μ„œλŠ” .exe 싀행이 μ•ˆ λœλ‹€λŠ” 것!


πŸ›  ν•΄κ²° 1: extraResources + unpack μ˜΅μ…˜ μΆ”κ°€

κ·Έλž˜μ„œ μ΄λ ‡κ²Œ electron-builder 섀정을 κ³ μ³€μŠ΅λ‹ˆλ‹€.


"build": {
  "extraResources": [
    {
      "from": "public",
      "to": "public",
      "filter": ["**/*"],
      "unpack": true}
  ]

그리고 μ½”λ“œμ—μ„œ κ²½λ‘œλŠ” μ•„λž˜μ²˜λŸΌ λ³€κ²½ν–ˆμŠ΅λ‹ˆλ‹€.


const enginePath = path.join(process.resourcesPath, 'app.asar.unpacked', 'public', 'Engine.exe');

이제 λ“œλ””μ–΄ 배포 λ²„μ „μ—μ„œλ„ exeκ°€ 싀행될 쀄 μ•Œμ•˜μŠ΅λ‹ˆλ‹€.

그런데...


😑 문제 2: μ–ΈνŒ©λ„ ν–ˆλŠ”λ°, μ—¬μ „νžˆ μ•ˆ λŒμ•„κ°„λ‹€κ³ μš”?

λΆ„λͺ…νžˆ app.asar.unpacked에 잘 λ“€μ–΄κ°€ μžˆλŠ”λ°λ„ 싀행이 μ•ˆ λ˜λŠ” κ²λ‹ˆλ‹€.

κ·Έλž˜μ„œ 직접 cmdλ₯Ό μ—΄μ–΄μ„œ μ—”μ§„ 경둜둜 κ°€μ„œ μ‹€ν–‰ν•΄λ΄€μŠ΅λ‹ˆλ‹€.


cd C:\Users\...\resources\app.asar.unpacked\public\
./seph_engine.exe

μ–΄λž? 🀯 μˆ˜λ™ 싀행은 λ˜λ„€?

κ·ΈλŸ¬λ‹ˆκΉŒ λ¬Έμ œλŠ” 파일이 μ—†μ–΄μ„œκ°€ μ•„λ‹ˆλΌ Electron이 싀행을 λͺ» μ‹œν‚¨λ‹€λŠ” κ±°μ˜€λ˜ κ²λ‹ˆλ‹€.


πŸ“¦ λ°°ν¬ν•˜κ³  spawn ν˜ΈμΆœν–ˆλ”λ‹ˆ?

아무 일도 μΌμ–΄λ‚˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

μ•„λ¬΄λŸ° μ—λŸ¬λ„ 없이, 아무것도 μ‹€ν–‰λ˜μ§€ μ•ŠλŠ” spawn.


Logger.info(`[ENGINE] spawn 성곡, PID: ${engineProcess.pid}`);

PID: undefined πŸ‘€

μ•„λ‹ˆ 뭐…?


😑 β€œμ—”μ§„μ΄ μ£½μ—ˆμŠ΅λ‹ˆλ‹€β€

엔진이 μ•ˆ λŒμ•„κ°€λ‹ˆ Pipe도 연결이 μ•ˆ λ©λ‹ˆλ‹€.


[PIPE] reqClientκ°€ nullμž…λ‹ˆλ‹€.
[PIPE] reqClientλŠ” writableν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

그리고 μ‚¬μš©μžμ—κ²ŒλŠ” 이런 λ©”μ‹œμ§€λ‘œ κ°€μ£ .

⚠️ β€œμ—”μ§„ νŒŒμ΄ν”„μ— μ—°κ²°λ˜μ–΄ μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.”


πŸ”¬ 디버깅 μ‹œμž‘: spawn이 λ¬Έμ œμ˜€λ‹€κ³ ?

Electronμ—μ„œ spawn()은 μ™ΈλΆ€ μ‹€ν–‰νŒŒμΌμ„ 직접 μ‹€ν–‰ν•©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ 배포 λ²„μ „μ—μ„œλŠ” λ³΄μ•ˆ μ •μ±… + 경둜 문제 + κΆŒν•œ 문제둜 인해…

πŸ’£ "spawn이 μž‘λ™ μ•ˆ ν•©λ‹ˆλ‹€"

심지어 κ²½λ‘œλ„ μ™„λ²½ν•˜κ²Œ μ–ΈνŒ©ν•΄λ†¨λŠ”λ°μš”?


C:\Users\me\AppData\Local\Programs\MyApp\resources\app.asar.unpacked\public\seph_engine.exe

이거λ₯Ό μˆ˜λ™μœΌλ‘œ cmdμ—μ„œ μ‹€ν–‰ν•˜λ©΄ λ˜λŠ”λ°μš”?!

Electron만 λͺ»ν•©λ‹ˆλ‹€ 😱


πŸ›  ν•΄κ²° 2: κ·Έλž˜μ„œ κ²°κ΅­ exec("start /B")둜 ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€


const command = `start /B "" "${enginePath}"`;
exec(command, { cwd: engineDir, windowsHide: true });

start /BλŠ” μœˆλ„μš° CMD λͺ…λ Ήμ–΄λ‘œ "CMDμ—μ„œ λ°±κ·ΈλΌμš΄λ“œλ‘œ μ‹€ν–‰ν•˜λΌ"λŠ” λœ»μž…λ‹ˆλ‹€.

Electron이 직접 μ‹€ν–‰ν•˜μ§„ μ•Šμ§€λ§Œ, CMDκ°€ λŒ€μ‹  μ‹€ν–‰ν•΄μ£ΌλŠ” λ°©μ‹μž…λ‹ˆλ‹€.

μœˆλ„μš°μ—μ„œλŠ” 이게 였히렀 더 ν™•μ‹€ν•˜κ²Œ μ‹€ν–‰λ˜λ”κ΅°μš”.

βœ”οΈ 그리고 이 λ°©λ²•μœΌλ‘œ λ“œλ””μ–΄ λ°°ν¬μ—μ„œλ„ μ™„λ²½ν•˜κ²Œ λŒμ•„κ°”μŠ΅λ‹ˆλ‹€!


✨ μ΅œμ’… μš”μ•½

λ¬Έμ œν•΄κ²° 방법
.exe μ‹€ν–‰ μ‹€νŒ¨app.asar.unpacked에 λ„£κΈ° + process.resourcesPath μ‚¬μš©
싀행은 λ˜λŠ”λ° Electron이 λͺ» 싀행함exec("start /B ...") λ°©μ‹μœΌλ‘œ CMD κ°•μ œ μ‹€ν–‰

πŸ˜… λ§ˆλ¬΄λ¦¬ν•˜λ©°

개발자 μ—¬λŸ¬λΆ„β€¦

β€œλ‘œμ»¬μ—μ„œλŠ” 잘 λμŠ΅λ‹ˆλ‹€λ§Œβ€¦β€

이 말, 이제 μž…μ— μ˜¬λ¦¬μ§€ λ§™μ‹œλ‹€β€¦

Electron은 배포가 λ°˜μž…λ‹ˆλ‹€. μ•„λ‹ˆ, 배포가 μ§„μ§œ μ „μŸμž…λ‹ˆλ‹€. πŸͺ–

ν˜Ήμ‹œ μ—¬λŸ¬λΆ„λ„ λ°°ν¬μ—μ„œ .exe 싀행이 μ•ˆ λΌμ„œ 고톡받고 계신닀면

μœ„ 방법 κΌ­ μ‹œλ„ν•΄λ³΄μ„Έμš”. 제 λ°˜λ‚˜μ ˆμ„ μ•„λ‚„ 수 μžˆμŠ΅λ‹ˆλ‹€ πŸ™

profile
ν”„λ‘ νŠΈμ—”λ“œ 개발쟈!!

0개의 λŒ“κΈ€