打包分发.command 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #!/bin/bash
  2. # 一键打包分发:只打代码与运行所需文件,本机密钥与数据(config.json / session.json /
  3. # manual-shops.json / ops-export.json / data/ / workspace/)默认不进包 —— 对方启动后
  4. # 会自动生成他们本机的配置和空数据库。
  5. #
  6. # 用法:
  7. # ./打包分发.command 仅代码(推荐)
  8. # ./打包分发.command --with-data 额外带上当前 data/ops.db(演示数据,注意脱敏)
  9. cd "$(dirname "$0")" || exit 1
  10. NAME="智慧运营中台-分发包"
  11. OUT="dist/$NAME"
  12. ZIP="dist/$NAME.zip"
  13. WITH_DATA=0
  14. [ "$1" = "--with-data" ] && WITH_DATA=1
  15. rm -rf "$OUT" "$ZIP" || exit 1
  16. mkdir -p "$OUT" "dist" || exit 1
  17. # 根目录代码:用通配更稳,新增模块不会漏
  18. for f in *.js; do
  19. case "$f" in
  20. config.js|session.js) continue ;;
  21. esac
  22. [ -f "$f" ] && cp "$f" "$OUT/"
  23. done
  24. # 配置文件与启动脚本
  25. for f in package.json package-lock.json config.example.json README.md \
  26. 启动.command 启动.sh 启动.bat 打包分发.command 打包分发.bat; do
  27. [ -f "$f" ] && cp "$f" "$OUT/"
  28. done
  29. # 目录(前端 / 服务端 / 脚本 / 依赖)
  30. for d in public server scripts napos node_modules; do
  31. [ -d "$d" ] && cp -R "$d" "$OUT/"
  32. done
  33. # 兜底:任何本机敏感文件都不进包
  34. rm -f "$OUT/config.json" "$OUT/session.json" "$OUT/manual-shops.json" "$OUT/ops-export.json"
  35. rm -rf "$OUT/data" "$OUT/workspace"
  36. find "$OUT" -name ".DS_Store" -delete 2>/dev/null
  37. if [ "$WITH_DATA" = "1" ] && [ -f data/ops.db ]; then
  38. mkdir -p "$OUT/data"
  39. # checkpoint 后再复制,保证 ops.db 自包含
  40. node -e "const {DatabaseSync}=require('node:sqlite');const db=new DatabaseSync('data/ops.db');db.exec('PRAGMA wal_checkpoint(TRUNCATE)');db.close();" 2>/dev/null || true
  41. cp data/ops.db "$OUT/data/ops.db"
  42. echo "已包含演示数据库:data/ops.db(请确认数据可外发)"
  43. fi
  44. # 打包前自检:缺任何一个运行期模块都直接失败,避免发出坏包
  45. if ! ( cd "$OUT" && node -e "require('./server/routes/index.js')" >/dev/null 2>&1 ); then
  46. echo "打包失败:分发包缺少运行期模块(请在包目录执行 node -e \"require('./server/routes/index.js')\" 查看具体缺失文件)"
  47. rm -rf "$OUT"
  48. exit 1
  49. fi
  50. (
  51. cd dist || exit 1
  52. rm -f "$NAME.zip"
  53. zip -qr "$NAME.zip" "$NAME"
  54. )
  55. if [ ! -f "$ZIP" ]; then
  56. echo "打包失败:$ZIP 未生成"; exit 1
  57. fi
  58. rm -rf "$OUT"
  59. SIZE=$(du -sh "$ZIP" | cut -f1)
  60. echo ""
  61. echo "已生成分发包: $ZIP($SIZE)"
  62. if [ "$WITH_DATA" = "1" ]; then
  63. echo "包含:代码 + node_modules + 演示数据库"
  64. else
  65. echo "包含:代码 + node_modules(不含 config.json / data / workspace)"
  66. fi
  67. echo ""
  68. echo "对方解压后:"
  69. echo " 1) 双击 启动.command(macOS)或 启动.bat(Windows)"
  70. echo " 2) 首次启动自动生成 config.json 与空数据库"
  71. echo " 3) 在「系统设置」里填自己的 API Key"
  72. echo ""
  73. echo "要求 Node.js >= 22.13(内置 SQLite 驱动);装过旧版可直接覆盖解压。"