#!/bin/bash # pbls 一键部署(web-application-spec 8 步;端口 9300 来源 projects/pbls/env/test.json) set -euo pipefail cdir=$(cd "$(dirname "$0")" && pwd) APP=pbls PORT=${PORT:-9300} DB_HOST=127.0.0.1; DB_PORT=3306; DB_USER=test; DB_PASS=test123; DB_NAME=pbl ENV_JSON="$cdir/../../projects/pbls/env/test.json" [ -f "$ENV_JSON" ] && PORT=$(python3 -c "import json;print(json.load(open('$ENV_JSON'))['port'])") echo "[build] app=$APP port=$PORT (env source: $ENV_JSON)" mkdir -p "$cdir/pkgs" "$cdir/logs" "$cdir/files" # 1) 基础包 + 依赖 pip install -q -r "$cdir/requirements.txt" || echo "[warn] pip requirements 需离线源,跳过" # 2) 模块 clone + 安装(基础模块 + 复用基座 + 12 个 pbl_*) MODULES="world scene entity script_engine scense scense_game scense_runtime \ pbl_common pbl_appcodes pbl_blueprint pbl_validation pbl_compiler pbl_agent_runtime \ pbl_evidence pbl_assessment pbl_kdb_ext pbl_domain_ext pbl_scense_ext pbl_runtime_ext" for m in $MODULES; do src="$cdir/../../modules/$m" [ -d "$src" ] || { echo "[skip] module $m 不存在"; continue; } [ -d "$cdir/pkgs/$m" ] || cp -r "$src" "$cdir/pkgs/$m" if [ -f "$cdir/pkgs/$m/pyproject.toml" ]; then pip install -q -e "$cdir/pkgs/$m" || echo "[warn] pip install -e $m 失败,回退 PYTHONPATH" fi export PYTHONPATH="$cdir/pkgs:$PYTHONPATH" # 3) wwwroot 软链(非 cp,保持同步) ln -sfn "$cdir/pkgs/$m/wwwroot" "$cdir/wwwroot/$m" # 5) 建表:models/*.json → DDL(json2ddl),与 apps/pbls/scripts/ddl 同源 if [ -d "$cdir/pkgs/$m/models" ]; then ( cd "$cdir/pkgs/$m/models" && json2ddl mysql . > mysql.ddl.sql 2>/dev/null || true ) [ -s "$cdir/pkgs/$m/models/mysql.ddl.sql" ] && \ mysql -h "$DB_HOST" -P "$DB_PORT" -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" \ < "$cdir/pkgs/$m/models/mysql.ddl.sql" || echo "[warn] DDL 执行跳过($m)" fi # 6) CRUD 生成:json/*.json → .dspy + .ui if [ -d "$cdir/pkgs/$m/json" ]; then ( cd "$cdir/pkgs/$m/json" && xls2ui -m ../models -o ../wwwroot "$m" *.json 2>/dev/null || true ) fi # 7) 初始化数据(appcodes 等种子) [ -f "$cdir/pkgs/$m/init/data.json" ] && echo "[info] $m 有 init/data.json,由 load_$m() 幂等注入" # 8) RBAC 路径注册 [ -f "$cdir/pkgs/$m/scripts/load_path.py" ] && \ python3 "$cdir/pkgs/$m/scripts/load_path.py" || echo "[warn] $m rbac 注册跳过" done # 4) i18n 合并 python3 "$cdir/scripts/merge_i18n.py" 2>/dev/null || echo "[info] i18n 合并跳过" # 兜底建表(36 表,MariaDB 方言,幂等 CREATE TABLE IF NOT EXISTS) bash "$cdir/scripts/apply_ddl.sh" || echo "[warn] apply_ddl 跳过(离线/无库)" # bricks 前端 [ -d "$cdir/pkgs/bricks/dist" ] && ln -sfn "$cdir/pkgs/bricks/dist" "$cdir/wwwroot/bricks" # 启动/停止脚本 cat > "$cdir/start.sh" <> logs/$APP.out 2>&1 & echo \$! > $APP.pid EOF cat > "$cdir/stop.sh" <