You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

111 lines
2.9 KiB

// @ts-nocheck
import { main } from "../package.json"
import { join } from "path"
import * as electron from "electron"
import * as dotenv from "dotenv"
import * as ora from "ora"
import * as chalk from "chalk"
import * as minimist from "minimist"
import { exec, spawn, ChildProcess } from "child_process"
import { watch, rollup, OutputOptions } from "rollup"
import { waitOn } from "./utils"
import options from "./rollup.config"
// 注入环境变量
dotenv.config({ path: join(__dirname, "../.env") })
// 解析命令行参数
const argv = minimist(process.argv.slice(2))
// rollup配置
const opts = options(argv.env)
const TAG = "[build-main.ts]"
// 加载图
const spinner = ora(`${TAG} Electron build...`)
console.log(join(__dirname, "../node_modules/.bin/vite"))
function runVite() {
return new Promise((resolve, reject) => {
let viteProcess = spawn("node", [`D:/1XYX/pro/vite-electron/node_modules/vite/bin/vite.js`], {
stdio: "pipe",
env: Object.assign(process.env, { NODE_ENV: argv.env }),
})
if (viteProcess) {
let isReady = false
viteProcess.stdout.on("data", data => {
// console.log(`${data}`)
if (!isReady && data.indexOf("ready") != -1) {
resolve(viteProcess)
}
})
viteProcess.stderr.on("data", data => {
console.error(`[vite err]: ${data}`)
reject()
})
viteProcess.on("close", code => {
console.log(`[vite close]: exited with code ${code}`)
reject()
})
} else {
reject()
}
})
}
function runElectron() {
return new Promise((resolve, reject) => {
let electronProcess = spawn(electron as unknown as string, [join(__dirname, `../${main}`)], {
stdio: "pipe",
env: Object.assign(process.env, { NODE_ENV: argv.env }),
})
if (electronProcess) {
resolve(electronProcess)
} else {
reject()
}
})
}
;(async () => {
let vitePorcess = await runVite()
console.log('[vite]', chalk.green(`vite ready.`))
const watcher = watch(opts)
let child: ChildProcess | null
let manualRestart = false
watcher.on("change", filename => {
const log = chalk.green(`change -- ${filename}`)
console.log(TAG, log)
})
watcher.on("event",async ev => {
if (ev.code === "END") {
if (child && child.kill) {
manualRestart = true
child.kill()
child = null
setTimeout(() => {
manualRestart = false
}, 5000)
}
try {
child = await runElectron()
console.log('[electron]', chalk.green(`electron ready.`))
child.on("close", () => {
if (!manualRestart) {
vitePorcess.kill()
child.kill()
process.exit()
}
})
} catch (ev) {
console.log(ev.error)
vitePorcess.kill()
child.kill()
process.exit()
}
} else if (ev.code === "ERROR") {
console.log(ev.error)
}
})
})()