build-desktop.mjs 1.7 KB

1234567891011121314151617181920212223242526
  1. import { build } from 'esbuild'
  2. import { cp, mkdir, rm, readdir, readFile, writeFile } from 'node:fs/promises'
  3. import { resolve } from 'node:path'
  4. const root = resolve(import.meta.dirname, '..'), out = resolve(root, '.desktop-build')
  5. await rm(out, { recursive: true, force: true })
  6. await mkdir(out, { recursive: true })
  7. await build({ entryPoints: [resolve(root, 'src/server/index.ts')], outfile: resolve(out, 'server.mjs'),
  8. bundle: true, platform: 'node', format: 'esm', target: 'node24', external: ['vite'],
  9. banner: { js: "import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);" },
  10. define: { 'process.env.NODE_ENV': '"production"' }, sourcemap: true,
  11. })
  12. await cp(resolve(root, 'dist'), resolve(out, 'ui'), { recursive: true })
  13. await cp(resolve(root, 'release.json'), resolve(out, 'release.json'))
  14. await cp(resolve(root, 'public/icons/icon-512.png'), resolve(root, 'desktop/icon.png'))
  15. const shell = resolve(out, 'shell')
  16. await mkdir(shell)
  17. for (const file of await readdir(resolve(root, 'desktop'))) {
  18. if (file.endsWith('.test.mjs') || !/\.(mjs|cjs|html|css|png)$/.test(file)) continue
  19. await cp(resolve(root, 'desktop', file), resolve(shell, file))
  20. }
  21. const manifest = JSON.parse(await readFile(resolve(root, 'release.json'), 'utf8'))
  22. await writeFile(resolve(shell, 'package.json'), JSON.stringify({ name: 'hermes-yaoyao-desktop', version: manifest.webVersion,
  23. productName: '夭夭', description: '夭夭:本地服务、多 Agent 团队与电脑工作空间',
  24. author: 'YaoYao contributors', license: 'BSL-1.1', main: 'main.mjs', type: 'module' }, null, 2))
  25. console.log('桌面服务和界面已打包到 .desktop-build')