#!/bin/bash # ===================================================== # package.sh — 编译并把 wind_power 产物整理到 runtime/wind_power/ # # 输出目录结构: # runtime/wind_power/ # ├── wind_server # 后端可执行 # ├── config/ # server_config.json 等静态配置 # ├── web/ # 前端静态资源(vite build 产物) # ├── libs/ # 运行期依赖库(libdrogon/libtrantor .so) # └── logs/ # 日志目录(运行时写入) # # 用法: # ./package.sh # 默认 Release # ./package.sh --build-type Debug # ./package.sh --publish # 额外打包到 publish/wind_power-.tar.gz # # 参考: edge_collector/package.sh # ===================================================== set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" RUNTIME_DIR="${ROOT_DIR}/runtime/wind_power" PUBLISH_DIR="${ROOT_DIR}/publish" PKG_BUILD="${ROOT_DIR}/build_package" BUILD_TYPE="Release" PACKAGE_VERSION="0.1.0" PUBLISH=false # ---- 参数解析 ---- while [ $# -gt 0 ]; do case "$1" in --build-type) BUILD_TYPE="$2"; shift 2 ;; --version) PACKAGE_VERSION="$2"; shift 2 ;; --publish|publish) PUBLISH=true; shift ;; *) echo "[package] 未知参数: $1"; exit 1 ;; esac done # ---- 颜色 ---- GREEN='\033[0;32m'; YELLOW='\033[1;33m'; CYAN='\033[0;36m'; NC='\033[0m' info() { echo -e "${GREEN}[INFO]${NC} $1"; } step() { echo -e "${CYAN}[STEP]${NC} $1"; } warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } # 1. 确保 Drogon 已从源码编译(产物存在则秒过) step "1/5 确保 Drogon ..." THIRD_PARTY="${ROOT_DIR}/third_party" source "${ROOT_DIR}/third_party/ensure_third_party.sh" ARCH="${TARGET_ARCH}" info "target arch = ${ARCH}, drogon install = ${DROGON_INSTALL}" # 2. 构建后端 step "2/5 构建后端 (${BUILD_TYPE}) ..." cmake -S "${ROOT_DIR}/backend" -B "${PKG_BUILD}" -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" cmake --build "${PKG_BUILD}" -j"$(nproc)" # 3. 构建前端 step "3/5 构建前端 ..." ( cd "${ROOT_DIR}/frontend/web_app" [ -d node_modules ] || npm install --silent npm run build ) # 4. 整理 runtime 目录 step "4/5 整理 runtime/wind_power/ ..." rm -rf "${RUNTIME_DIR}" mkdir -p "${RUNTIME_DIR}"/{config,web,libs,logs} cp "${PKG_BUILD}/wind_server" "${RUNTIME_DIR}/" cp -r "${ROOT_DIR}"/backend/config/* "${RUNTIME_DIR}/config/" rsync -a --delete "${ROOT_DIR}/frontend/web_app/dist/" "${RUNTIME_DIR}/web/" # 运行期动态库(部署机无需安装 Drogon) cp "${DROGON_INSTALL}"/libs/libdrogon.so* "${RUNTIME_DIR}/libs/" cp "${DROGON_INSTALL}"/libs/libtrantor.so* "${RUNTIME_DIR}/libs/" # 只保留实际文件,去掉会随版本变化的开发符号链接末级 info "runtime libs: $(ls "${RUNTIME_DIR}/libs/")" # 5. 可选:打包为 tar.gz if [ "${PUBLISH}" = true ]; then step "5/5 打包 publish/wind_power-${PACKAGE_VERSION}.tar.gz ..." mkdir -p "${PUBLISH_DIR}" tar -czf "${PUBLISH_DIR}/wind_power-${PACKAGE_VERSION}.tar.gz" -C "${ROOT_DIR}/runtime" wind_power info "✅ ${PUBLISH_DIR}/wind_power-${PACKAGE_VERSION}.tar.gz" else info "跳过打包(加 --publish 可生成 tar.gz)" fi info "✅ 打包完成 → ${RUNTIME_DIR}"