coder-common-thin-backend/script/fix-directory-structure.sh
Leo 4a512427ed docs: 完善项目重构脚本功能和文档
- 更新script/README.md,增加详细的使用指南和最佳实践
- 新增simple-fix.sh脚本用于快速修复包名重复问题
- 新增fix-duplicate-packages.sh脚本专门处理重复包名检测和修复
- 新增fix-directory-structure.sh脚本用于重建目录结构
- 优化project-refactor.sh脚本,增强重复包名处理能力
- 完善脚本选择建议和问题排查步骤
2025-07-09 16:47:36 +08:00

286 lines
10 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# 目录结构修复脚本 - 专门修复重复包名目录问题
# Author: Leocoder
# Version: 1.0
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
WHITE='\033[1;37m'
NC='\033[0m' # No Color
# 全局变量
PROJECT_DIR=""
# 打印信息
print_step() {
echo -e "${BLUE}════════════════════════════════════════════════════════════════════════════════${NC}"
echo -e "${WHITE}$1${NC}"
echo -e "${BLUE}════════════════════════════════════════════════════════════════════════════════${NC}"
}
print_success() {
echo -e "${GREEN}$1${NC}"
}
print_warning() {
echo -e "${YELLOW}$1${NC}"
}
print_error() {
echo -e "${RED}$1${NC}"
}
print_info() {
echo -e "${PURPLE} $1${NC}"
}
# 获取项目目录
get_project_dir() {
if [ -z "$1" ]; then
PROJECT_DIR="$(pwd)"
else
PROJECT_DIR="$1"
fi
if [ ! -d "$PROJECT_DIR" ]; then
print_error "项目目录不存在: $PROJECT_DIR"
exit 1
fi
if [ ! -f "$PROJECT_DIR/pom.xml" ]; then
print_error "这不是一个Maven项目"
exit 1
fi
print_success "项目目录: $PROJECT_DIR"
}
# 备份重要文件
backup_files() {
print_step "步骤 1: 备份重要文件"
local backup_dir="/tmp/package_fix_backup_$(date +%Y%m%d_%H%M%S)"
mkdir -p "$backup_dir"
# 查找所有Java文件并备份
find "$PROJECT_DIR" -name "*.java" | while read java_file; do
local rel_path="${java_file#$PROJECT_DIR/}"
local target_file="$backup_dir/$rel_path"
mkdir -p "$(dirname "$target_file")"
cp "$java_file" "$target_file"
done
print_success "文件已备份到: $backup_dir"
}
# 收集所有Java文件
collect_java_files() {
print_step "步骤 2: 收集所有Java文件"
local temp_dir="/tmp/java_files_$(date +%Y%m%d_%H%M%S)"
mkdir -p "$temp_dir"
# 查找所有Java文件并复制到临时目录
find "$PROJECT_DIR" -name "*.java" -path "*/org/leocoder/*" | while read java_file; do
# 提取相对于org的路径
local rel_path=$(echo "$java_file" | sed 's|.*/org/leocoder/|org/leocoder/|')
local target_file="$temp_dir/$rel_path"
# 创建目标目录
mkdir -p "$(dirname "$target_file")"
# 复制文件
cp "$java_file" "$target_file"
print_info "收集文件: $rel_path"
done
echo "$temp_dir"
}
# 清理错误的目录结构
cleanup_wrong_structure() {
print_step "步骤 3: 清理错误的目录结构"
# 删除所有org目录
find "$PROJECT_DIR" -type d -name "org" -path "*/src/main/java/*" | while read org_dir; do
print_info "删除目录: $org_dir"
rm -rf "$org_dir"
done
print_success "已清理所有org目录"
}
# 重建正确的目录结构
rebuild_structure() {
print_step "步骤 4: 重建正确的目录结构"
local temp_dir="$1"
local count=0
# 查找所有Java源码目录
find "$PROJECT_DIR" -type d -path "*/src/main/java" | while read java_src_dir; do
print_info "处理目录: $java_src_dir"
# 在每个java目录下重建org/leocoder/estate结构
local target_base="$java_src_dir/org/leocoder/estate"
mkdir -p "$target_base"
# 从临时目录复制对应的文件
if [ -d "$temp_dir/org/leocoder/estate" ]; then
# 获取模块名称来判断应该复制哪些文件
local module_name=$(echo "$java_src_dir" | grep -o 'coder-estate-[^/]*' | head -1)
case "$module_name" in
"coder-estate-common")
if [ -d "$temp_dir/org/leocoder/estate/common" ]; then
cp -r "$temp_dir/org/leocoder/estate/common" "$target_base/"
print_info "复制common模块文件"
fi
;;
"coder-estate-model")
if [ -d "$temp_dir/org/leocoder/estate/domain" ]; then
cp -r "$temp_dir/org/leocoder/estate/domain" "$target_base/"
print_info "复制model模块文件"
fi
;;
"coder-estate-system")
if [ -d "$temp_dir/org/leocoder/estate/system" ]; then
cp -r "$temp_dir/org/leocoder/estate/system" "$target_base/"
print_info "复制system模块文件"
fi
;;
"coder-estate-web")
if [ -d "$temp_dir/org/leocoder/estate/web" ]; then
cp -r "$temp_dir/org/leocoder/estate/web" "$target_base/"
print_info "复制web模块文件"
fi
;;
"coder-estate-mybatisplus")
if [ -d "$temp_dir/org/leocoder/estate/mybatisplus" ]; then
cp -r "$temp_dir/org/leocoder/estate/mybatisplus" "$target_base/"
print_info "复制mybatisplus模块文件"
fi
;;
*plugin*)
# 处理插件模块
local plugin_type=$(echo "$module_name" | sed 's/coder-estate-//')
if [ -d "$temp_dir/org/leocoder/estate/$plugin_type" ]; then
cp -r "$temp_dir/org/leocoder/estate/$plugin_type" "$target_base/"
print_info "复制${plugin_type}插件文件"
fi
;;
esac
fi
((count++))
done
print_success "已重建 $count 个模块的目录结构"
}
# 修复文件内容中的包名
fix_package_names() {
print_step "步骤 5: 修复文件内容中的包名"
local count=0
# 查找所有Java文件并修复包名
find "$PROJECT_DIR" -name "*.java" -path "*/org/leocoder/estate/*" | while read java_file; do
# 检查是否包含错误的包名
if grep -q "org\.leocoder\.org\.leocoder" "$java_file"; then
print_info "修复包名: $(basename "$java_file")"
# 修复包名
sed -i '' 's|org\.leocoder\.org\.leocoder\.estate|org.leocoder.estate|g' "$java_file"
sed -i '' 's|org\.leocoder\.org\.leocoder|org.leocoder|g' "$java_file"
((count++))
fi
done
print_success "已修复 $count 个文件的包名"
}
# 验证修复结果
verify_result() {
print_step "步骤 6: 验证修复结果"
# 检查是否还有重复目录
local duplicate_dirs=$(find "$PROJECT_DIR" -type d -path "*/org/leocoder/org/leocoder*" 2>/dev/null)
if [ -n "$duplicate_dirs" ]; then
print_warning "仍然存在重复目录:"
echo "$duplicate_dirs"
return 1
fi
# 检查Java文件数量
local java_count=$(find "$PROJECT_DIR" -name "*.java" -path "*/org/leocoder/estate/*" | wc -l)
print_info "Java文件总数: $java_count"
# 检查模块结构
local modules=$(find "$PROJECT_DIR" -type d -path "*/src/main/java/org/leocoder/estate" | wc -l)
print_info "模块数量: $modules"
print_success "目录结构修复完成"
}
# 清理临时文件
cleanup_temp() {
local temp_dir="$1"
if [ -d "$temp_dir" ]; then
rm -rf "$temp_dir"
print_info "已清理临时文件"
fi
}
# 主函数
main() {
echo -e "${CYAN}"
echo "╔══════════════════════════════════════════════════════════════════════════════╗"
echo "║ 目录结构修复脚本 ║"
echo "║ Directory Structure Fix Tool ║"
echo "║ Version 1.0 ║"
echo "╚══════════════════════════════════════════════════════════════════════════════╝"
echo -e "${NC}"
get_project_dir "$1"
echo ""
echo -e "${YELLOW}警告: 此操作将重新组织项目目录结构,建议先备份项目!${NC}"
echo ""
read -p "是否继续? (y/N): " confirm
if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
print_info "操作已取消"
exit 0
fi
# 执行修复步骤
backup_files
local temp_dir=$(collect_java_files)
cleanup_wrong_structure
rebuild_structure "$temp_dir"
fix_package_names
verify_result
cleanup_temp "$temp_dir"
echo -e "${GREEN}"
echo "╔══════════════════════════════════════════════════════════════════════════════╗"
echo "║ 目录结构修复完成! ║"
echo "║ ║"
echo "║ 下一步建议: ║"
echo "║ 1. 重新编译项目验证修复效果 ║"
echo "║ 2. 检查IDE中的导入语句 ║"
echo "║ 3. 运行测试确保功能正常 ║"
echo "╚══════════════════════════════════════════════════════════════════════════════╝"
echo -e "${NC}"
}
# 脚本入口
main "$@"