const fs = require("fs-extra"); const path = require("path"); const esbuild = require("esbuild"); const { execSync } = require("child_process"); const distDir = path.join(__dirname, "dist"); const origPackagePath = path.join(__dirname, "package.json"); async function build() { console.log("πŸš€ λΉŒλ“œ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹œμž‘ν•©λ‹ˆλ‹€..."); // 1. κΈ°μ‘΄ dist 폴더 μ΄ˆκΈ°ν™” console.log("🧹 dist 폴더λ₯Ό μ²­μ†Œν•©λ‹ˆλ‹€..."); fs.emptyDirSync(distDir); // 2. esbuildλ₯Ό μ‚¬μš©ν•œ μ†ŒμŠ€ μ½”λ“œ λ²ˆλ“€λ§ console.log("πŸ“¦ esbuild둜 μ†ŒμŠ€ μ½”λ“œλ₯Ό λΉŒλ“œν•˜λŠ” 쀑..."); // μ™ΈλΆ€λ‘œ λΊ„ μ˜μ‘΄μ„± (λŸ°νƒ€μž„μ— 에셋/λ°”μ΄λ„ˆλ¦¬κ°€ 직접 ν•„μš”ν•œ 것듀) const externalModules = [ "sequelize", "mysql2", "pdfkit", "swagger-ui-express", "swagger-jsdoc" ]; try { await esbuild.build({ entryPoints: [path.join(__dirname, "server.js")], bundle: true, platform: "node", target: "node20", format: "cjs", outfile: path.join(distDir, "server.js"), external: externalModules, minify: false, // 디버깅 편의λ₯Ό μœ„ν•΄ λ‚œλ…ν™”/압좕은 적용 μ•ˆ 함 sourcemap: false, }); console.log("βœ… μ†ŒμŠ€ μ½”λ“œ λΉŒλ“œ μ™„λ£Œ (dist/server.js)"); } catch (err) { console.error("❌ λΉŒλ“œ 쀑 였λ₯˜ λ°œμƒ:", err); process.exit(1); } // 3. 배포용 package.json μž‘μ„± console.log("πŸ“ 배포용 package.json을 μƒμ„±ν•©λ‹ˆλ‹€..."); const origPackage = fs.readJsonSync(origPackagePath); const distPackage = { name: origPackage.name + "-dist", version: origPackage.version, main: "server.js", scripts: { start: "node server.js" }, dependencies: {} }; // μ™ΈλΆ€ μ˜μ‘΄μ„±λ“€μ˜ 버전을 원본 package.jsonμ—μ„œ 가져와 등둝 externalModules.forEach(mod => { if (origPackage.dependencies[mod]) { distPackage.dependencies[mod] = origPackage.dependencies[mod]; } else { // ν˜Ήμ‹œ 원본에 λͺ…μ‹œλ˜μ§€ μ•Šμ€ 경우 μ™€μΌλ“œμΉ΄λ“œλ‘œ μ§€μ • distPackage.dependencies[mod] = "*"; } }); fs.writeJsonSync(path.join(distDir, "package.json"), distPackage, { spaces: 2 }); console.log("βœ… 배포용 package.json 생성 μ™„λ£Œ"); // 4. dist λ‚΄μ—μ„œ 배포용 node_modules μ„€μΉ˜ console.log("🚚 dist λ‚΄λΆ€μ—μ„œ 배포용 μ˜μ‘΄μ„± νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•©λ‹ˆλ‹€ (npm install --omit=dev)..."); // OS별 npm λͺ…λ Ήμ–΄ λΆ„κΈ° (μœˆλ„μš°μ—μ„œλŠ” npm.cmd μ‚¬μš©) const npmCmd = process.platform === "win32" ? "npm.cmd" : "npm"; try { execSync(`${npmCmd} install --omit=dev`, { cwd: distDir, stdio: "inherit" // μ„€μΉ˜ 둜그λ₯Ό ν˜„μž¬ ν”„λ‘œμ„ΈμŠ€ μ½˜μ†”μ— 연동 }); console.log("βœ… 배포용 μ˜μ‘΄μ„± νŒ¨ν‚€μ§€ μ„€μΉ˜ μ™„λ£Œ (dist/node_modules)"); } catch (err) { console.error("❌ μ˜μ‘΄μ„± μ„€μΉ˜ 쀑 였λ₯˜ λ°œμƒ:", err); process.exit(1); } console.log("\nπŸŽ‰ λͺ¨λ“  λΉŒλ“œ ν”„λ‘œμ„ΈμŠ€κ°€ μ„±κ³΅μ μœΌλ‘œ λλ‚¬μŠ΅λ‹ˆλ‹€!"); console.log("πŸ‘‰ 'dist' 폴더λ₯Ό 파일질라둜 μ—…λ‘œλ“œν•˜μ—¬ μ‚¬μš©ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€."); } build();