library-picturebook-activity/backend/scripts/compress.sh

220 lines
5.7 KiB
Bash
Raw Normal View History

2026-01-18 17:58:38 +08:00
#!/bin/bash
# 压缩脚本
# 使用方法:
# ./scripts/compress.sh # 使用默认配置(不包含 node_modules
# ./scripts/compress.sh --include-node-modules # 使用默认配置(包含 node_modules
# ./scripts/compress.sh -n # 使用默认配置(包含 node_modules简写
# ./scripts/compress.sh --env production --version 1.0.0 # 指定环境和版本
# ./scripts/compress.sh --env test --version 1.0.0 -n # 组合使用多个参数
# ./scripts/compress.sh src/ package.json # 自定义文件/文件夹列表
set -e
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 默认值
ENV=""
VERSION=""
INCLUDE_NODE_MODULES=false
# 解析命令行参数
CUSTOM_ITEMS=()
while [[ $# -gt 0 ]]; do
case $1 in
--include-node-modules|-n)
INCLUDE_NODE_MODULES=true
shift
;;
--env)
if [ -z "$2" ]; then
echo -e "${RED}错误: --env 参数需要一个值${NC}"
exit 1
fi
ENV="$2"
shift 2
;;
--version)
if [ -z "$2" ]; then
echo -e "${RED}错误: --version 参数需要一个值${NC}"
exit 1
fi
VERSION="$2"
shift 2
;;
*)
CUSTOM_ITEMS+=("$1")
shift
;;
esac
done
# 构建输出文件名
OUTPUT_FILE="competition-management-service"
if [ -n "$ENV" ]; then
OUTPUT_FILE="${OUTPUT_FILE}-${ENV}"
fi
if [ -n "$VERSION" ]; then
OUTPUT_FILE="${OUTPUT_FILE}-${VERSION}"
fi
OUTPUT_FILE="${OUTPUT_FILE}.tgz"
# 默认要压缩的文件和文件夹(如果用户没有指定)
DEFAULT_ITEMS=(
"dist"
"package.json"
"tsconfig.json"
"ecosystem.config.js"
"prisma/"
".env"
".env.development"
".env.production"
".env.test"
)
# 如果指定了包含 node_modules则添加到默认列表的开头
if [ "$INCLUDE_NODE_MODULES" = true ]; then
DEFAULT_ITEMS=("node_modules" "${DEFAULT_ITEMS[@]}")
fi
# 排除的文件和文件夹模式
EXCLUDE_PATTERNS=(
"docs/"
"scripts/"
"sql/"
".git"
".DS_Store"
"*.log"
"./logs"
"coverage"
"*.tmp"
"*.temp"
".cache"
".pnpm-store"
)
# 获取脚本所在目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
# 切换到项目根目录
cd "$PROJECT_ROOT"
echo -e "${GREEN}📦 开始压缩项目...${NC}"
if [ -n "$ENV" ]; then
echo -e "${BLUE}环境: ${ENV}${NC}"
fi
if [ -n "$VERSION" ]; then
echo -e "${BLUE}版本: ${VERSION}${NC}"
fi
echo ""
# 确定要压缩的文件和文件夹
if [ ${#CUSTOM_ITEMS[@]} -eq 0 ]; then
if [ "$INCLUDE_NODE_MODULES" = true ]; then
echo -e "${YELLOW}未指定文件/文件夹,使用默认配置(包含 node_modules${NC}"
else
echo -e "${YELLOW}未指定文件/文件夹,使用默认配置(不包含 node_modules${NC}"
fi
ITEMS_TO_COMPRESS=("${DEFAULT_ITEMS[@]}")
else
echo -e "${YELLOW}使用自定义文件/文件夹列表${NC}"
ITEMS_TO_COMPRESS=("${CUSTOM_ITEMS[@]}")
fi
# 验证文件和文件夹是否存在
echo -e "${BLUE}检查文件/文件夹是否存在...${NC}"
MISSING_ITEMS=()
for item in "${ITEMS_TO_COMPRESS[@]}"; do
if [ ! -e "$item" ]; then
MISSING_ITEMS+=("$item")
echo -e "${RED} ⚠️ 警告: $item 不存在,将被跳过${NC}"
else
echo -e "${GREEN}$item${NC}"
fi
done
# 如果有缺失的文件,询问是否继续
if [ ${#MISSING_ITEMS[@]} -gt 0 ]; then
echo ""
echo -e "${YELLOW}发现 ${#MISSING_ITEMS[@]} 个不存在的文件/文件夹${NC}"
read -p "是否继续压缩? (y/n) " -n 1 -r
echo ""
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
echo -e "${RED}已取消压缩${NC}"
exit 1
fi
fi
# 构建 tar 排除选项
EXCLUDE_ARGS=()
for pattern in "${EXCLUDE_PATTERNS[@]}"; do
EXCLUDE_ARGS+=(--exclude="$pattern")
done
# 如果输出文件已存在,询问是否覆盖
if [ -f "$OUTPUT_FILE" ]; then
echo ""
echo -e "${YELLOW}输出文件 $OUTPUT_FILE 已存在${NC}"
read -p "是否覆盖? (y/n) " -n 1 -r
echo ""
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
echo -e "${RED}已取消压缩${NC}"
exit 1
fi
rm -f "$OUTPUT_FILE"
fi
# 执行压缩
echo ""
echo -e "${BLUE}正在压缩...${NC}"
# 使用 tar 压缩
tar -czf "$OUTPUT_FILE" \
"${EXCLUDE_ARGS[@]}" \
"${ITEMS_TO_COMPRESS[@]}" 2>/dev/null || {
echo -e "${RED}压缩失败${NC}"
exit 1
}
# 检查压缩结果
if [ ! -f "$OUTPUT_FILE" ]; then
echo -e "${RED}错误: 压缩文件未生成${NC}"
exit 1
fi
# 显示压缩文件信息
FILE_SIZE=$(du -h "$OUTPUT_FILE" | cut -f1)
echo ""
echo -e "${GREEN}═══════════════════════════════════════${NC}"
echo -e "${GREEN}✅ 压缩完成!${NC}"
echo -e "${GREEN}═══════════════════════════════════════${NC}"
echo ""
echo "📦 输出文件: $OUTPUT_FILE"
echo "📊 文件大小: $FILE_SIZE"
echo "📍 位置: $(pwd)/$OUTPUT_FILE"
if [ -n "$ENV" ]; then
echo "🌍 环境: $ENV"
fi
if [ -n "$VERSION" ]; then
echo "🏷️ 版本: $VERSION"
fi
echo ""
echo "📝 已压缩的内容:"
for item in "${ITEMS_TO_COMPRESS[@]}"; do
if [ -e "$item" ]; then
echo "$item"
fi
done
echo ""
echo "🚫 已排除的内容:"
for pattern in "${EXCLUDE_PATTERNS[@]}"; do
echo "$pattern"
done
echo ""