package-arm64.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. const { execSync, spawn } = require('child_process')
  2. const path = require('path')
  3. const fs = require('fs')
  4. function runElectronBuilder(cwd, env) {
  5. const binName = process.platform === 'win32' ? 'electron-builder.cmd' : 'electron-builder'
  6. const electronBuilderBin = path.join(cwd, 'node_modules', '.bin', binName)
  7. if (!fs.existsSync(electronBuilderBin)) {
  8. return Promise.reject(new Error('未找到 electron-builder,请先在项目根目录执行 npm install。'))
  9. }
  10. return new Promise((resolve, reject) => {
  11. const args = ['--win', '--arm64']
  12. const opts = {
  13. cwd,
  14. stdio: ['inherit', 'inherit', 'inherit'],
  15. env: { ...process.env, ...env, DEBUG: 'electron-builder' },
  16. windowsHide: false
  17. }
  18. if (process.platform === 'win32') {
  19. opts.shell = true
  20. }
  21. const child = spawn(electronBuilderBin, args, opts)
  22. let elapsed = 0
  23. const progressInterval = setInterval(() => {
  24. elapsed += 10
  25. console.log(` → 打包进行中... (已等待 ${elapsed} 秒,请勿关闭)`)
  26. }, 10000)
  27. child.on('close', (code) => {
  28. clearInterval(progressInterval)
  29. if (code !== 0) {
  30. const err = new Error(`electron-builder 退出码: ${code}`)
  31. err.exitCode = code
  32. reject(err)
  33. } else resolve()
  34. })
  35. child.on('error', (err) => {
  36. clearInterval(progressInterval)
  37. reject(err)
  38. })
  39. })
  40. }
  41. const projectRoot = path.resolve(__dirname, '..')
  42. const distDir = path.join(projectRoot, 'dist')
  43. function cleanDist(keepDir) {
  44. if (!fs.existsSync(distDir)) return
  45. for (const name of fs.readdirSync(distDir)) {
  46. if (name === keepDir) continue
  47. const full = path.join(distDir, name)
  48. try {
  49. if (fs.statSync(full).isDirectory()) fs.rmSync(full, { recursive: true })
  50. else fs.unlinkSync(full)
  51. } catch (e) {
  52. console.warn('clean:', e.message)
  53. }
  54. }
  55. }
  56. async function main() {
  57. const keepDir = 'win-arm64-unpacked'
  58. try {
  59. console.log('[1/3] Vite build...')
  60. execSync('npm run build', { cwd: projectRoot, stdio: 'inherit' })
  61. } catch (e) {
  62. console.error('\n[错误] 第 1 步 Vite build 失败,已停止打包。')
  63. console.error(e.message || e)
  64. process.exit(1)
  65. }
  66. try {
  67. console.log('[2/3] Electron builder win arm64...(每 10 秒会打印进度,请勿关闭)')
  68. await runElectronBuilder(projectRoot, {})
  69. } catch (e) {
  70. console.error('\n[错误] 第 2 步 electron-builder 失败,已停止打包。')
  71. console.error(e.message || e)
  72. process.exit(1)
  73. }
  74. try {
  75. console.log('[3/3] 清理 dist,只保留 win-arm64-unpacked...')
  76. cleanDist(keepDir)
  77. console.log('Done. Output: dist\\win-arm64-unpacked')
  78. } catch (e) {
  79. console.error('\n[错误] 第 3 步 清理 dist 失败。')
  80. console.error(e.message || e)
  81. process.exit(1)
  82. }
  83. }
  84. if (require.main === module) {
  85. main().catch((e) => {
  86. console.error(e)
  87. process.exit(1)
  88. })
  89. } else {
  90. module.exports = { cleanDist }
  91. }