69 lines
3.1 KiB
Bash
69 lines
3.1 KiB
Bash
#!/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" <<EOF
|
||
#!/bin/bash
|
||
cd "$cdir" && PYTHONPATH="$cdir/pkgs:\$PYTHONPATH" python3 app/$APP.py >> logs/$APP.out 2>&1 &
|
||
echo \$! > $APP.pid
|
||
EOF
|
||
cat > "$cdir/stop.sh" <<EOF
|
||
#!/bin/bash
|
||
cd "$cdir" && [ -f $APP.pid ] && kill \$(cat $APP.pid) && rm -f $APP.pid
|
||
EOF
|
||
chmod +x "$cdir/start.sh" "$cdir/stop.sh"
|
||
echo "[build] done. start: ./start.sh port: $PORT"
|