#!/bin/bash # 一键打包分发:只打代码与运行所需文件,本机密钥与数据(config.json / session.json / # manual-shops.json / ops-export.json / data/ / workspace/)默认不进包 —— 对方启动后 # 会自动生成他们本机的配置和空数据库。 # # 用法: # ./打包分发.command 仅代码(推荐) # ./打包分发.command --with-data 额外带上当前 data/ops.db(演示数据,注意脱敏) cd "$(dirname "$0")" || exit 1 NAME="智慧运营中台-分发包" OUT="dist/$NAME" ZIP="dist/$NAME.zip" WITH_DATA=0 [ "$1" = "--with-data" ] && WITH_DATA=1 rm -rf "$OUT" "$ZIP" || exit 1 mkdir -p "$OUT" "dist" || exit 1 # 根目录代码:用通配更稳,新增模块不会漏 for f in *.js; do case "$f" in config.js|session.js) continue ;; esac [ -f "$f" ] && cp "$f" "$OUT/" done # 配置文件与启动脚本 for f in package.json package-lock.json config.example.json README.md \ 启动.command 启动.sh 启动.bat 打包分发.command 打包分发.bat; do [ -f "$f" ] && cp "$f" "$OUT/" done # 目录(前端 / 服务端 / 脚本 / 依赖) for d in public server scripts napos node_modules; do [ -d "$d" ] && cp -R "$d" "$OUT/" done # 兜底:任何本机敏感文件都不进包 rm -f "$OUT/config.json" "$OUT/session.json" "$OUT/manual-shops.json" "$OUT/ops-export.json" rm -rf "$OUT/data" "$OUT/workspace" find "$OUT" -name ".DS_Store" -delete 2>/dev/null if [ "$WITH_DATA" = "1" ] && [ -f data/ops.db ]; then mkdir -p "$OUT/data" # checkpoint 后再复制,保证 ops.db 自包含 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 cp data/ops.db "$OUT/data/ops.db" echo "已包含演示数据库:data/ops.db(请确认数据可外发)" fi # 打包前自检:缺任何一个运行期模块都直接失败,避免发出坏包 if ! ( cd "$OUT" && node -e "require('./server/routes/index.js')" >/dev/null 2>&1 ); then echo "打包失败:分发包缺少运行期模块(请在包目录执行 node -e \"require('./server/routes/index.js')\" 查看具体缺失文件)" rm -rf "$OUT" exit 1 fi ( cd dist || exit 1 rm -f "$NAME.zip" zip -qr "$NAME.zip" "$NAME" ) if [ ! -f "$ZIP" ]; then echo "打包失败:$ZIP 未生成"; exit 1 fi rm -rf "$OUT" SIZE=$(du -sh "$ZIP" | cut -f1) echo "" echo "已生成分发包: $ZIP($SIZE)" if [ "$WITH_DATA" = "1" ]; then echo "包含:代码 + node_modules + 演示数据库" else echo "包含:代码 + node_modules(不含 config.json / data / workspace)" fi echo "" echo "对方解压后:" echo " 1) 双击 启动.command(macOS)或 启动.bat(Windows)" echo " 2) 首次启动自动生成 config.json 与空数据库" echo " 3) 在「系统设置」里填自己的 API Key" echo "" echo "要求 Node.js >= 22.13(内置 SQLite 驱动);装过旧版可直接覆盖解压。"