package-arm64.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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 buildDir = path.join(projectRoot, 'package', 'build')
  43. const packageCacheDir = path.join(projectRoot, 'package', 'arm64', 'cache')
  44. function getBuilderEnv() {
  45. if (!fs.existsSync(packageCacheDir)) fs.mkdirSync(packageCacheDir, { recursive: true })
  46. return {
  47. ...process.env,
  48. ELECTRON_BUILDER_CACHE: packageCacheDir + path.sep,
  49. // 使用国内镜像,避免 GitHub 超时导致 winCodeSign 下载失败
  50. ELECTRON_BUILDER_BINARIES_MIRROR: process.env.ELECTRON_BUILDER_BINARIES_MIRROR || 'https://npmmirror.com/mirrors/electron-builder-binaries/releases/download/',
  51. }
  52. }
  53. function cleanDist(keepDir) {
  54. if (!fs.existsSync(buildDir)) return
  55. for (const name of fs.readdirSync(buildDir)) {
  56. if (name === keepDir) continue
  57. const full = path.join(buildDir, name)
  58. try {
  59. if (fs.statSync(full).isDirectory()) fs.rmSync(full, { recursive: true })
  60. else fs.unlinkSync(full)
  61. } catch (e) {
  62. console.warn('clean:', e.message)
  63. }
  64. }
  65. }
  66. async function main() {
  67. const keepDir = 'win-arm64-unpacked'
  68. try {
  69. console.log('[1/3] Vite build...')
  70. execSync('npm run build', { cwd: projectRoot, stdio: 'inherit' })
  71. } catch (e) {
  72. console.error('\n[错误] 第 1 步 Vite build 失败,已停止打包。')
  73. console.error(e.message || e)
  74. process.exit(1)
  75. }
  76. try {
  77. console.log('[2/3] Electron builder win arm64...(每 10 秒会打印进度,请勿关闭)')
  78. await runElectronBuilder(projectRoot, getBuilderEnv())
  79. } catch (e) {
  80. console.error('\n[错误] 第 2 步 electron-builder 失败,已停止打包。')
  81. console.error(e.message || e)
  82. process.exit(1)
  83. }
  84. try {
  85. console.log('[3/3] 清理 package/build,只保留 win-arm64-unpacked...')
  86. cleanDist(keepDir)
  87. console.log('Done. Output: package/build\\win-arm64-unpacked')
  88. } catch (e) {
  89. console.error('\n[错误] 第 3 步 清理 package/build 失败。')
  90. console.error(e.message || e)
  91. process.exit(1)
  92. }
  93. }
  94. if (require.main === module) {
  95. main().catch((e) => {
  96. console.error(e)
  97. process.exit(1)
  98. })
  99. } else {
  100. module.exports = { cleanDist }
  101. }