Electron + Viteλ‘ κ°λ°νλ©΄μ VM νκ²½μμ ν¨ν€μ§μ νλ€ λ³΄λ©΄,
βκ°μ μ½λ, κ°μ μ€μ μΈλ° μμ§μ΄ μ μ΄λ¦°λ€βλ μ΄μν μν©μ κ²ͺλ κ²½μ°κ° μμ΅λλ€.
μ²μμλ λ¨μν VM(κ°μλ¨Έμ ) μλ λ¬Έμ κ² κ±°λ νκ³ λμ΄κ°μ§λ§,
λ¬Έμ λ ν루μ΄νμ΄ μλλΌ λΉλν λλ§λ€ κ°λ κΌ λνλλ€λ μ μ΄μμ£ .
λ μ΄μν 건, μ무κ²λ λ°κΎΈμ§ μκ³ λ€μ λΉλνλ©΄ λ μ λλ€λ κ²μ΄μμ΅λλ€.
μ΄μ―€ λλ©΄ μ΄μ΄ μ’μ 건μ§, λΉλκ° μ₯λμ μΉλ κ±΄μ§ μ μ μμμ΅λλ€.
λΉλλ₯Ό νλ©΄ dist/
, release/
, build/
κ°μ ν΄λμ μ€ν νμΌκ³Ό λ²λ€λ JSκ° μμ±λ©λλ€.
μ΄κ² λ°λ‘ λΉλ μ°μΆλ¬Όμ λλ€.
λ¬Έμ λ μ΄ ν΄λμ λ¨μ μλ μμ νμΌμ΄ λ€μ λΉλμ κ·Έλλ‘ μμ¬ λ€μ΄κ° μ μλ€λ μ μ λλ€.
μ¬κΈ°μ μΊμ(Cache)κΉμ§ λν΄μ§λλ€.
Vite, Webpack, Next.js λ± λΉλ λꡬλ€μ λΉλλ₯Ό λΉ λ₯΄κ² νκΈ° μν΄ μΊμλ₯Ό μ¬μ©ν©λλ€.
λ³κ²½μ΄ μλ νμΌμ λ€μ μ²λ¦¬νμ§ μκ³ μ¬νμ©νμ£ .
νμ§λ§ κ°λ λ³κ²½ κ°μ§λ₯Ό λμΉλ©΄, μ€λλ κ²°κ³Όλ¬Όμ΄ κ·Έλλ‘ μ΄μλ¨μ λ²λ¦½λλ€.
μΊμλ λΉλ μλλ₯Ό λμ΄λ βλΆμ€ν°βμ΄μ§λ§, μλͺ» μ°μ΄λ©΄ λ°λͺ©μ μ‘λ βμ§λ’°βκ° λκΈ°λ ν©λλ€.
νλ‘μ νΈλ§λ€ μ§μμΌ ν ν΄λκ° λ€λ¦ λλ€.
μλ νλ λνμ μΈ λΉλ νκ²½μμ μ²μν΄μΌ ν μΊμμ λΉλ μ°μΆλ¬Ό ν΄λμ λλ€.
λΉλ/νλ μμν¬ | μΊμ ν΄λ | λΉλ μ°μΆλ¬Ό ν΄λ |
---|---|---|
Vite | .vite | dist/ |
Webpack | .webpack-cache | dist/ |
Next.js | .next | .next |
CRA | node_modules/.cache | build/ |
Electron | μμ(κΈ°λ³Έ) | dist/ , release/ |
Node.js | node_modules/.cache | μμ |
μ΄λλΆν° βν΄λ¦° λΉλ(Clean Build)βλΌλ κ°λ μ κΉμ΄ λ€μ¬λ€λ΄€μ΅λλ€.
ν΄λ¦° λΉλλ μ΄μ λΉλ μ°μΆλ¬Όκ³Ό μΊμλ₯Ό μμ ν μ§μ°κ³ , κΉ¨λν μνμμ μλ‘ λΉλνλ κ³Όμ μ λλ€.
λ¬Έμ μ κ·Όλ³Έ μμΈμ λ¨μνμ΅λλ€.
μ΄μ λΉλμ μμ¬ νμΌκ³Ό μΊμκ° μ λΉλμ μμ¬ λ€μ΄κ°λ©΄μ
νμΌ λλ½, λ³κ²½ λ―Έλ°μ κ°μ κΈ°μ΄ν νμμ λ§λ κ²μ΄μμ΅λλ€.
μλ μμ
# macOS / Linux
rm -rf dist release out build .vite .webpack-cache node_modules/.cache
# Windows PowerShell
rd /s /q dist release out build .vite .webpack-cache node_modules\.cache
npm μ€ν¬λ¦½νΈ μλν
"scripts": {
"clean": "rimraf dist release out build .vite .webpack-cache node_modules/.cache",
"build": "npm run clean && electron-builder"
}
rimraf μ€μΉ:
npm i rimraf --save-dev
Electron μ±μμ μμ§ μ€ν νμΌμ κ°μ΄ λ°°ν¬νλ €λ©΄,
electron-builder
μ extraResources
μ μ νν κ²½λ‘λ₯Ό μ§μ ν΄μΌ ν©λλ€.
"build": {
"asar": true,
"asarUnpack": [],
"extraResources": [
{ "from": "electron/engine/bin/seph_engine.exe", "to": "public/seph_engine.exe" }
],
"files": [
"dist/**",
"electron/**",
"!**/*.map"
]
}
κ²½λ‘λ₯Ό λͺ νν ν΄μ£Όλ©΄ ν¨ν€μ§ μ μμ§ νμΌ λλ½μ λ°©μ§ν μ μμ΅λλ€.
GitHub Actions, Jenkins, GitLab CI κ°μ CI/CD μλ²λ λ§€λ² κΉ¨λν νκ²½μμ λΉλνμ§λ§,
λΉλ μλλ₯Ό λμ΄λ €κ³ μΊμλ₯Ό μΌλ©΄ μ΄ λ¬Έμ κ° λ€μ μκΈΈ μ μμ΅λλ€.
GitHub Actions μμ
steps:
- name: Clean build
run: rm -rf dist release .vite .webpack-cache node_modules/.cache
- name: Install dependencies
run: npm ci
- name: Build
run: npm run build
import fs from 'fs';
import path from 'path';
import { spawn } from 'child_process';
const enginePath = path.join(process.resourcesPath, 'app.asar.unpacked', 'public', 'seph_engine.exe');
function fileExists(p: string) {
try { return fs.existsSync(p); } catch { return false; }
}
export function startEngine() {
if (!fileExists(enginePath)) {
throw new Error(`[Engine Missing] ${enginePath}`);
}
const proc = spawn(enginePath, [], { detached: true });
proc.on('error', (err) => {
console.error('[Engine Spawn Error]', err);
});
}
ν΄λ¦° λΉλλ νΉμ λΉλ λꡬ μ μ© κΈ°λ₯μ΄ μλλΌ, λͺ¨λ κ°λ° νκ²½μμ ν΅νλ μμ μ₯μΉμ λλ€.
μΊμλ λΉλ μκ°μ λ¨μΆμν€λ μ’μ λꡬμ§λ§, μλͺ» μ°μ΄λ©΄ λ°λͺ©μ μ‘λ μ£Όλ²μ΄ λμ£ .
νΉν VM νκ²½μμλ
ν΄λ¦° λΉλ + λ²μ μ¦κ° + κ²½λ‘ κ³ μ
μ΄ μΈ κ°μ§κ° λΉλ μμ μ±μ ν΅μ¬μ λλ€.
μ λ μμ μλ βμ λλ©΄ ν λ² λ λΉλνμ§ λβλΌκ³ μκ°νμ§λ§,
μ΄μ λ μ²μλΆν° κΉ¨λνκ² λΉλν΄μ ν λ²μ μ±κ³΅νλ μ΅κ΄μ λ€μμ΅λλ€.
λΉλ νκ²½λ μ§μ²λΌ, μ£ΌκΈ°μ μΈ λμ²μκ° νμν©λλ€.
μλ! κ³μ μ’μμ λλ¬μ£Όμλ€μ γ γ γ μ 벨λ‘κ·Έμ μΉκ΅¬ μλλ° νμ κ°μ¬ν©λλ€!γ γ