#!/usr/bin/env bash
|
# ─────────────────────────────────────────────────────────────────────────────
|
# 前端 dist 生产链(make web-dist 的实现体):
|
# 前端仓库 pnpm build:main → 产物快照到本目录 dist/(Docker build context,不入 git)
|
# + registry.yaml 里的 OnlyOffice 插件 → dist/onlyoffice-plugins/<release>/<code>/
|
#
|
# 与 flow-engine 的 prepare-context.sh 同构:产物快照进部署仓库构建,镜像溯源
|
# 靠 dist/.build-info(前端 git sha/分支/dirty/构建时间)。
|
#
|
# 用法:
|
# ./sync-dist.sh # 构建 + 拷贝(默认)
|
# SKIP_BUILD=1 ./sync-dist.sh # 只拷现有 dist(前端刚手工构建过时的快捷路径)
|
# FRONTEND_REPO=/path ./sync-dist.sh # 前端仓库不在默认位置时显式指定
|
#
|
# 前置:node >= 20.19、pnpm >= 9.12(前端仓库 engines 要求);构建吃 8GB 堆
|
#(NODE_OPTIONS 已在前端仓库 build script 内设置)。
|
# ─────────────────────────────────────────────────────────────────────────────
|
set -euo pipefail
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
FRONTEND_REPO="${FRONTEND_REPO:-$REPO_ROOT/../jnpf-web-monorepo-framework-v6.1}"
|
APP_DIST="$FRONTEND_REPO/apps/jnpf-web-apps-main/dist"
|
|
log() { printf '\033[1;32m[web-dist]\033[0m %s\n' "$*"; }
|
die() { printf '\033[1;31m[web-dist][err]\033[0m %s\n' "$*" >&2; exit 1; }
|
|
[ -d "$FRONTEND_REPO" ] || die "前端仓库不存在:${FRONTEND_REPO}(用 FRONTEND_REPO=/path 指定)"
|
|
# OnlyOffice 插件(2026-09-23):生产不走 pnpm dev:onlyoffice 开发网关,插件就是静态文件,
|
# 随 cx-web 发布到 /onlyoffice-plugins/<release>/<code>/(后端 OnlyOfficePluginResolver 按
|
# {public-base-url}/{release}/{code}/config.json 拼地址)。清单读前端 registry.yaml,
|
# 新增插件无需改本脚本。release 固定 0.1.0(generate-backend-config 只认 0.1.0 / 0.1.0-dev)。
|
PLUGIN_ROOT="$FRONTEND_REPO/packages/onlyoffice-plugins"
|
PLUGIN_RELEASE="${ONLYOFFICE_PLUGIN_RELEASE:-0.1.0}"
|
# 输出 "package directory" 对,按 registry.yaml 的书写顺序
|
plugin_list() {
|
awk '/^[[:space:]]+package:/{p=$2} /^[[:space:]]+directory:/{print p, $2}' "$PLUGIN_ROOT/registry.yaml"
|
}
|
[ -f "$PLUGIN_ROOT/registry.yaml" ] || die "缺插件注册表:${PLUGIN_ROOT}/registry.yaml"
|
|
if [ "${SKIP_BUILD:-0}" = "1" ]; then
|
log "SKIP_BUILD=1:跳过构建,直接拷贝现有 dist"
|
else
|
command -v pnpm >/dev/null || die "未找到 pnpm(前端构建需要 pnpm >= 9.12)"
|
log "pnpm build:main(前端仓库 ${FRONTEND_REPO},约需数分钟、8GB 堆)…"
|
( cd "$FRONTEND_REPO" && pnpm build:main )
|
while read -r pkg dir; do
|
log "OnlyOffice 插件 ${dir}:pnpm --filter ${pkg} build"
|
( cd "$FRONTEND_REPO" && pnpm --filter "$pkg" build >/dev/null ) || die "插件构建失败:${pkg}"
|
done < <(plugin_list)
|
fi
|
|
# 产物完整性:index.html=入口;_app.config.js=运行时配置注入点(缺=构建链变化,必须人工确认)
|
[ -f "$APP_DIST/index.html" ] || die "构建产物缺 index.html:${APP_DIST}"
|
[ -f "$APP_DIST/_app.config.js" ] || die "构建产物缺 _app.config.js(运行时配置注入点):${APP_DIST}"
|
|
# 先清后拷:防旧 hash 文件在 context 里无限堆积
|
DEST="$SCRIPT_DIR/dist"
|
rm -rf "$DEST"
|
cp -R "$APP_DIST" "$DEST"
|
|
N_PLUGINS=0
|
while read -r pkg dir; do
|
src="$PLUGIN_ROOT/$dir/dist"
|
[ -f "$src/config.json" ] && [ -f "$src/index.html" ] || die "插件产物不全:${src}(缺 config.json / index.html)"
|
mkdir -p "$DEST/onlyoffice-plugins/$PLUGIN_RELEASE"
|
cp -R "$src" "$DEST/onlyoffice-plugins/$PLUGIN_RELEASE/$dir"
|
N_PLUGINS=$((N_PLUGINS + 1))
|
done < <(plugin_list)
|
[ "$N_PLUGINS" -gt 0 ] || die "registry.yaml 未解析出任何插件"
|
log "OnlyOffice 插件 ${N_PLUGINS} 个 → dist/onlyoffice-plugins/${PLUGIN_RELEASE}/"
|
|
# 溯源信息:本地构建镜像无 RepoDigest,靠它对应回前端仓库 commit
|
FE_SHA="$(git -C "$FRONTEND_REPO" rev-parse --short HEAD 2>/dev/null || echo unknown)"
|
FE_BRANCH="$(git -C "$FRONTEND_REPO" rev-parse --abbrev-ref HEAD 2>/dev/null || echo unknown)"
|
FE_DIRTY=""
|
[ -n "$(git -C "$FRONTEND_REPO" status --porcelain 2>/dev/null)" ] && FE_DIRTY="-dirty"
|
cat > "$DEST/.build-info" <<EOF
|
frontend_repo=${FRONTEND_REPO}
|
frontend_git=${FE_BRANCH}@${FE_SHA}${FE_DIRTY}
|
built_at=$(date '+%Y-%m-%d %H:%M:%S %z')
|
EOF
|
|
log "dist 就绪:${DEST}($(du -sh "$DEST" | cut -f1),前端 ${FE_BRANCH}@${FE_SHA}${FE_DIRTY})"
|
[ -n "$FE_DIRTY" ] && printf '\033[1;33m[web-dist][warn]\033[0m %s\n' \
|
"前端仓库有未提交改动——正式交付前请先在前端仓库提交,保证镜像可溯源"
|
exit 0
|