#!/bin/bash # ============================================ # 前端编译发布脚本 # 用法: ./build-frontend.sh [项目名] # 示例: # ./build-frontend.sh # 打包所有前端项目 # ./build-frontend.sh admin # 只打包fund-admin # ./build-frontend.sh mobile # 只打包fund-mobile # ============================================ set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # 项目根目录 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" DEPLOY_DIR="${PROJECT_ROOT}/deploy" # 前端项目配置 declare -A FRONTEND_PROJECTS=( ["admin"]="fund-admin" ["mobile"]="fund-mobile" ) # 创建deploy目录 mkdir -p "${DEPLOY_DIR}" # 打印帮助信息 print_help() { echo "用法: $0 [项目名]" echo "" echo "可用项目:" echo " admin - 管理后台 (fund-admin)" echo " mobile - 移动端 (fund-mobile)" echo " all - 打包所有前端项目 (默认)" echo "" echo "示例:" echo " $0 # 打包所有前端项目" echo " $0 admin # 只打包管理后台" echo " $0 mobile # 只打包移动端" } # 检查Node.js环境 check_node() { if ! command -v node &> /dev/null; then echo -e "${RED}错误: 未安装Node.js,请先安装Node.js${NC}" exit 1 fi if ! command -v npm &> /dev/null; then echo -e "${RED}错误: 未安装npm,请先安装npm${NC}" exit 1 fi NODE_VERSION=$(node -v) echo -e "${GREEN}Node.js版本: ${NODE_VERSION}${NC}" } # 检查zip命令 check_zip() { if ! command -v zip &> /dev/null; then echo -e "${RED}错误: 未安装zip命令,请先安装zip${NC}" exit 1 fi } # 构建单个前端项目 build_project() { local key=$1 local project_name=${FRONTEND_PROJECTS[$key]} local project_dir="${PROJECT_ROOT}/${project_name}" local output_file="${DEPLOY_DIR}/${project_name}.zip" echo "" echo "==========================================" echo -e "${YELLOW}开始构建: ${project_name}${NC}" echo "==========================================" # 检查项目目录是否存在 if [ ! -d "${project_dir}" ]; then echo -e "${RED}错误: 项目目录不存在 ${project_dir}${NC}" return 1 fi # 检查package.json是否存在 if [ ! -f "${project_dir}/package.json" ]; then echo -e "${RED}错误: 未找到package.json ${project_dir}/package.json${NC}" return 1 fi cd "${project_dir}" # 安装依赖 echo -e "${YELLOW}正在安装依赖...${NC}" npm install --silent # 执行构建 echo -e "${YELLOW}正在编译项目...${NC}" npm run build:prod # 检查dist目录是否存在 if [ ! -d "dist" ]; then echo -e "${RED}错误: 构建失败,未生成dist目录${NC}" return 1 fi # 删除旧的zip文件 if [ -f "${output_file}" ]; then rm -f "${output_file}" echo -e "${YELLOW}已删除旧的打包文件${NC}" fi # 打包dist目录 echo -e "${YELLOW}正在打包...${NC}" cd dist zip -r "${output_file}" . -x "*.DS_Store" -x "__MACOSX/*" # 获取文件大小 local file_size=$(du -h "${output_file}" | cut -f1) echo -e "${GREEN}构建完成: ${output_file} (${file_size})${NC}" # 返回项目根目录 cd "${PROJECT_ROOT}" } # 主函数 main() { local target=${1:-"all"} echo "==========================================" echo " 前端编译发布脚本" echo "==========================================" echo "项目根目录: ${PROJECT_ROOT}" echo "输出目录: ${DEPLOY_DIR}" echo "目标项目: ${target}" echo "" # 环境检查 check_node check_zip # 创建deploy目录 mkdir -p "${DEPLOY_DIR}" local start_time=$(date +%s) case "${target}" in admin|mobile) build_project "${target}" ;; all) for key in "${!FRONTEND_PROJECTS[@]}"; do build_project "${key}" done ;; -h|--help|help) print_help exit 0 ;; *) echo -e "${RED}错误: 未知项目 '${target}'${NC}" print_help exit 1 ;; esac local end_time=$(date +%s) local duration=$((end_time - start_time)) echo "" echo "==========================================" echo -e "${GREEN}所有构建任务完成!${NC}" echo "总耗时: ${duration}秒" echo "==========================================" echo "" echo "打包文件列表:" ls -lh "${DEPLOY_DIR}"/*.zip 2>/dev/null || echo "无打包文件" } main "$@"