|
@@ -0,0 +1,721 @@
|
|
|
+@echo off
|
|
|
+setlocal enabledelayedexpansion
|
|
|
+chcp 65001 >nul
|
|
|
+
|
|
|
+REM ========================================
|
|
|
+REM 配置文件版本Java Protocol Buffers构建脚本
|
|
|
+REM 支持配置文件、命令行参数和灵活路径配置
|
|
|
+REM 使用protoc编译器直接生成Java代码
|
|
|
+REM ========================================
|
|
|
+
|
|
|
+REM ========================================
|
|
|
+REM 配置文件设置
|
|
|
+REM ========================================
|
|
|
+REM 配置文件路径 - 存储所有配置项的INI格式文件
|
|
|
+set CONFIG_FILE=buildjava_config.ini
|
|
|
+
|
|
|
+REM ========================================
|
|
|
+REM 默认配置值定义
|
|
|
+REM ========================================
|
|
|
+REM Proto文件输入目录 - 存放.proto文件的源目录
|
|
|
+set DEFAULT_PROTO_INPUT_DIR=.
|
|
|
+
|
|
|
+REM Java代码输出目录 - 生成的Java文件存放目录
|
|
|
+set DEFAULT_JAVA_OUTPUT_DIR=javaprotocol
|
|
|
+
|
|
|
+REM Protoc编译器路径 - Protocol Buffers编译器可执行文件路径
|
|
|
+set DEFAULT_PROTOC=protoc.exe
|
|
|
+
|
|
|
+REM 备份功能开关 - 是否在生成前备份现有Java文件 (true/false)
|
|
|
+set DEFAULT_BACKUP_ENABLED=true
|
|
|
+
|
|
|
+REM 详细输出模式 - 是否显示详细的处理信息 (true/false)
|
|
|
+set DEFAULT_VERBOSE=false
|
|
|
+
|
|
|
+REM 清理输出目录 - 是否在生成前清空输出目录 (true/false)
|
|
|
+set DEFAULT_CLEAN_OUTPUT=false
|
|
|
+
|
|
|
+REM Java项目目录 - 用于将生成的Java文件拷贝到实际项目中的目标目录
|
|
|
+set DEFAULT_JAVA_PROJECT_DIR=D:\project\game-framework\game-battle\src\main\java\vip\metadev\module\battle\protobuf
|
|
|
+
|
|
|
+REM Proto项目目录 - 用于将proto文件拷贝到独立的目标目录 (如果为空则使用JAVA_PROJECT_DIR/proto)
|
|
|
+set DEFAULT_PROTO_PROJECT_DIR=D:\project\game-framework\game-battle\src\main\resources\proto
|
|
|
+
|
|
|
+REM 拷贝到项目功能 - 是否启用自动拷贝到项目目录功能 (true/false)
|
|
|
+set DEFAULT_COPY_TO_PROJECT=true
|
|
|
+
|
|
|
+REM 包含文件模式 - 指定要处理的proto文件模式,支持通配符 (如: *.proto, battle_*.proto)
|
|
|
+REM set DEFAULT_INCLUDE_PROTO_FILES=*.proto
|
|
|
+set DEFAULT_INCLUDE_PROTO_FILES=msg_type_def.proto
|
|
|
+
|
|
|
+REM 排除文件模式 - 指定要排除的proto文件模式,支持通配符 (如: test_*.proto, *_old.proto)
|
|
|
+set DEFAULT_EXCLUDE_PROTO_FILES=
|
|
|
+
|
|
|
+REM 文件匹配模式 - 使用正则表达式进行更精确的文件匹配 (暂不支持,保留扩展性)
|
|
|
+set DEFAULT_PROTO_FILE_PATTERNS=
|
|
|
+
|
|
|
+REM ========================================
|
|
|
+REM 配置变量初始化
|
|
|
+REM ========================================
|
|
|
+REM 将默认值赋给实际使用的配置变量,这些变量会在后续被配置文件或命令行参数覆盖
|
|
|
+set PROTO_INPUT_DIR=%DEFAULT_PROTO_INPUT_DIR%
|
|
|
+set JAVA_OUTPUT_DIR=%DEFAULT_JAVA_OUTPUT_DIR%
|
|
|
+set PROTOC=%DEFAULT_PROTOC%
|
|
|
+set BACKUP_ENABLED=%DEFAULT_BACKUP_ENABLED%
|
|
|
+set VERBOSE=%DEFAULT_VERBOSE%
|
|
|
+set CLEAN_OUTPUT=%DEFAULT_CLEAN_OUTPUT%
|
|
|
+set JAVA_PROJECT_DIR=%DEFAULT_JAVA_PROJECT_DIR%
|
|
|
+set PROTO_PROJECT_DIR=%DEFAULT_PROTO_PROJECT_DIR%
|
|
|
+set COPY_TO_PROJECT=%DEFAULT_COPY_TO_PROJECT%
|
|
|
+set INCLUDE_PROTO_FILES=%DEFAULT_INCLUDE_PROTO_FILES%
|
|
|
+set EXCLUDE_PROTO_FILES=%DEFAULT_EXCLUDE_PROTO_FILES%
|
|
|
+set PROTO_FILE_PATTERNS=%DEFAULT_PROTO_FILE_PATTERNS%
|
|
|
+
|
|
|
+REM ========================================
|
|
|
+REM 配置文件加载和参数解析
|
|
|
+REM ========================================
|
|
|
+REM 检查并加载配置文件 - 如果配置文件存在则加载,否则创建默认配置
|
|
|
+if exist "%CONFIG_FILE%" (
|
|
|
+ echo 📖 加载配置文件: %CONFIG_FILE%
|
|
|
+ call :load_config
|
|
|
+) else (
|
|
|
+ echo 📝 配置文件不存在,创建默认配置...
|
|
|
+ call :create_default_config
|
|
|
+)
|
|
|
+
|
|
|
+REM 解析命令行参数 - 命令行参数会覆盖配置文件中的设置,提供运行时配置灵活性
|
|
|
+call :parse_args
|
|
|
+
|
|
|
+echo.
|
|
|
+echo ========================================
|
|
|
+echo 配置文件版本Java Protocol Buffers构建工具
|
|
|
+echo ========================================
|
|
|
+echo.
|
|
|
+
|
|
|
+REM ========================================
|
|
|
+REM 配置信息显示
|
|
|
+REM ========================================
|
|
|
+REM 显示当前配置 - 展示所有配置项的当前值,便于用户确认配置是否正确
|
|
|
+echo 📋 当前配置:
|
|
|
+echo Proto输入目录: %PROTO_INPUT_DIR%
|
|
|
+echo Java输出目录: %JAVA_OUTPUT_DIR%
|
|
|
+echo Protoc编译器: %PROTOC%
|
|
|
+echo 备份功能: %BACKUP_ENABLED%
|
|
|
+echo 详细模式: %VERBOSE%
|
|
|
+echo 清理输出: %CLEAN_OUTPUT%
|
|
|
+echo Java项目目录: %JAVA_PROJECT_DIR%
|
|
|
+echo Proto项目目录: %PROTO_PROJECT_DIR%
|
|
|
+echo 拷贝到项目: %COPY_TO_PROJECT% (Java文件 + Proto文件)
|
|
|
+echo 包含文件模式: %INCLUDE_PROTO_FILES%
|
|
|
+echo 排除文件模式: %EXCLUDE_PROTO_FILES%
|
|
|
+echo 文件匹配模式: %PROTO_FILE_PATTERNS%
|
|
|
+echo ========================================
|
|
|
+echo.
|
|
|
+
|
|
|
+REM ========================================
|
|
|
+REM 环境检查和文件搜索
|
|
|
+REM ========================================
|
|
|
+REM 检查protoc编译器是否存在 - 验证配置的protoc路径是否有效
|
|
|
+if not exist "%PROTOC%" (
|
|
|
+ echo ❌ 错误: 未找到 %PROTOC%
|
|
|
+ echo 请确保protoc.exe在指定路径中可用
|
|
|
+ echo.
|
|
|
+ echo 💡 提示:
|
|
|
+ echo 1. 在配置文件中修改PROTOC路径
|
|
|
+ echo 2. 使用 --protoc 参数指定路径
|
|
|
+ echo 3. 确保protoc.exe在当前目录或PATH中
|
|
|
+ echo.
|
|
|
+ pause
|
|
|
+ exit /b 1
|
|
|
+)
|
|
|
+
|
|
|
+REM 搜索proto文件 - 根据配置的包含/排除模式查找要处理的文件
|
|
|
+echo 🔍 搜索proto文件...
|
|
|
+set /a proto_count=0
|
|
|
+set /a filtered_count=0
|
|
|
+
|
|
|
+REM 调用文件过滤函数 - 应用包含/排除规则,生成最终要处理的文件列表
|
|
|
+call :filter_proto_files
|
|
|
+
|
|
|
+if %proto_count% equ 0 (
|
|
|
+ echo ❌ 错误: 在 %PROTO_INPUT_DIR% 目录中未找到.proto文件
|
|
|
+ echo.
|
|
|
+ echo 请检查:
|
|
|
+ echo 1. 配置文件中的PROTO_INPUT_DIR路径
|
|
|
+ echo 2. --input 参数路径
|
|
|
+ echo 3. 该目录下是否有.proto文件
|
|
|
+ echo.
|
|
|
+ pause
|
|
|
+ exit /b 1
|
|
|
+)
|
|
|
+
|
|
|
+echo 📊 找到 %proto_count% 个proto文件
|
|
|
+if "%VERBOSE%"=="true" echo.
|
|
|
+
|
|
|
+REM ========================================
|
|
|
+REM 输出目录管理和备份
|
|
|
+REM ========================================
|
|
|
+REM 清理输出目录 - 根据配置决定是否在生成前清空现有输出目录
|
|
|
+if "%CLEAN_OUTPUT%"=="true" (
|
|
|
+ if exist "%JAVA_OUTPUT_DIR%" (
|
|
|
+ echo 🗑️ 清理输出目录: %JAVA_OUTPUT_DIR%
|
|
|
+ rmdir /s /q "%JAVA_OUTPUT_DIR%" 2>nul
|
|
|
+ )
|
|
|
+)
|
|
|
+
|
|
|
+REM 创建备份 - 根据配置决定是否备份现有的Java文件,防止意外覆盖
|
|
|
+if "%BACKUP_ENABLED%"=="true" (
|
|
|
+ if not exist "backup" mkdir "backup"
|
|
|
+ set BACKUP_DIR=backup_%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%
|
|
|
+ set BACKUP_DIR=%BACKUP_DIR: =0%
|
|
|
+
|
|
|
+ if exist "%JAVA_OUTPUT_DIR%" (
|
|
|
+ echo 🔄 备份现有输出目录...
|
|
|
+ move "%JAVA_OUTPUT_DIR%" "backup\%BACKUP_DIR%" >nul 2>&1
|
|
|
+ echo ✅ 已备份到: backup\%BACKUP_DIR%
|
|
|
+ )
|
|
|
+)
|
|
|
+
|
|
|
+REM 创建输出目录 - 确保Java代码输出目录存在,为后续生成做准备
|
|
|
+mkdir "%JAVA_OUTPUT_DIR%" 2>nul
|
|
|
+echo ✅ 创建输出目录: %JAVA_OUTPUT_DIR%
|
|
|
+echo.
|
|
|
+
|
|
|
+REM ========================================
|
|
|
+REM Java代码生成
|
|
|
+REM ========================================
|
|
|
+REM 生成Java代码 - 使用protoc编译器将proto文件转换为Java代码
|
|
|
+echo 🚀 开始生成Java代码...
|
|
|
+echo.
|
|
|
+
|
|
|
+set /a success_count=0
|
|
|
+set /a fail_count=0
|
|
|
+
|
|
|
+REM 调用编译函数 - 根据过滤后的文件列表进行批量编译
|
|
|
+call :compile_proto_files
|
|
|
+
|
|
|
+echo ========================================
|
|
|
+echo 📊 代码生成结果:
|
|
|
+echo 成功: %success_count%
|
|
|
+echo 失败: %fail_count%
|
|
|
+echo ========================================
|
|
|
+echo.
|
|
|
+
|
|
|
+if %fail_count% gtr 0 (
|
|
|
+ echo Warning: %fail_count% files failed to process
|
|
|
+ echo Please check proto file syntax and dependencies
|
|
|
+ echo.
|
|
|
+) else (
|
|
|
+ echo All proto files processed successfully!
|
|
|
+ echo.
|
|
|
+
|
|
|
+ REM ========================================
|
|
|
+ REM Java文件整理
|
|
|
+ REM ========================================
|
|
|
+ REM 将所有Java文件移动到主目录 - protoc可能生成嵌套目录结构,需要整理到统一目录
|
|
|
+ echo 🔄 整理Java文件到主目录...
|
|
|
+ for /r "%JAVA_OUTPUT_DIR%" %%f in (*.java) do (
|
|
|
+ if not "%%~dpf"=="%JAVA_OUTPUT_DIR%\" (
|
|
|
+ move "%%f" "%JAVA_OUTPUT_DIR%\" >nul 2>&1
|
|
|
+ if !errorlevel! equ 0 (
|
|
|
+ if "%VERBOSE%"=="true" echo ✅ 移动: %%~nxf
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+
|
|
|
+ REM 删除空的子目录 - 清理protoc生成的空目录,保持输出目录整洁
|
|
|
+ for /f "delims=" %%d in ('dir "%JAVA_OUTPUT_DIR%" /ad /b 2^>nul') do (
|
|
|
+ rmdir "%JAVA_OUTPUT_DIR%\%%d" 2>nul
|
|
|
+ )
|
|
|
+
|
|
|
+ echo ✅ Java文件整理完成
|
|
|
+)
|
|
|
+
|
|
|
+REM 拷贝到Java项目目录(如果启用)
|
|
|
+if "%COPY_TO_PROJECT%"=="true" (
|
|
|
+ if not "%JAVA_PROJECT_DIR%"=="" (
|
|
|
+ echo.
|
|
|
+ echo 🔄 拷贝Java文件到项目目录: %JAVA_PROJECT_DIR%
|
|
|
+
|
|
|
+ REM 检查目标目录是否存在
|
|
|
+ if not exist "%JAVA_PROJECT_DIR%" (
|
|
|
+ echo 📁 创建目标目录: %JAVA_PROJECT_DIR%
|
|
|
+ mkdir "%JAVA_PROJECT_DIR%" 2>nul
|
|
|
+ )
|
|
|
+
|
|
|
+ REM 拷贝所有Java文件
|
|
|
+ set copy_count=0
|
|
|
+ for %%f in ("%JAVA_OUTPUT_DIR%\*.java") do (
|
|
|
+ copy "%%f" "%JAVA_PROJECT_DIR%\" >nul 2>&1
|
|
|
+ if !errorlevel! equ 0 (
|
|
|
+ set /a copy_count+=1
|
|
|
+ if "%VERBOSE%"=="true" echo ✅ 拷贝: %%~nxf
|
|
|
+ ) else (
|
|
|
+ echo ❌ 拷贝失败: %%~nxf
|
|
|
+ )
|
|
|
+ )
|
|
|
+
|
|
|
+ if !copy_count! gtr 0 (
|
|
|
+ echo ✅ 成功拷贝 !copy_count! 个Java文件到项目目录
|
|
|
+ ) else (
|
|
|
+ echo ❌ 没有文件被拷贝
|
|
|
+ )
|
|
|
+
|
|
|
+ REM ========================================
|
|
|
+ REM Proto文件拷贝
|
|
|
+ REM ========================================
|
|
|
+ REM 拷贝对应的proto文件到项目目录 - 便于开发时查看proto定义
|
|
|
+ echo.
|
|
|
+ echo 🔄 拷贝Proto文件到项目目录...
|
|
|
+
|
|
|
+ REM 确定proto文件目标目录
|
|
|
+ if not "%PROTO_PROJECT_DIR%"=="" (
|
|
|
+ REM 使用独立的proto项目目录
|
|
|
+ set PROTO_TARGET_DIR=%PROTO_PROJECT_DIR%
|
|
|
+ ) else (
|
|
|
+ REM 使用Java项目目录下的proto子目录
|
|
|
+ set PROTO_TARGET_DIR=%JAVA_PROJECT_DIR%\proto
|
|
|
+ )
|
|
|
+
|
|
|
+ REM 创建proto文件目标目录
|
|
|
+ if not exist "!PROTO_TARGET_DIR!" (
|
|
|
+ echo 📁 创建proto目标目录: !PROTO_TARGET_DIR!
|
|
|
+ mkdir "!PROTO_TARGET_DIR!" 2>nul
|
|
|
+ )
|
|
|
+
|
|
|
+ REM 拷贝过滤后的proto文件
|
|
|
+ set proto_copy_count=0
|
|
|
+ if defined FILTERED_FILE_LIST (
|
|
|
+ REM 使用过滤后的文件列表
|
|
|
+ for /f "delims=" %%f in (!FILTERED_FILE_LIST!) do (
|
|
|
+ if exist "%PROTO_INPUT_DIR%\%%f" (
|
|
|
+ copy "%PROTO_INPUT_DIR%\%%f" "!PROTO_TARGET_DIR!\" >nul 2>&1
|
|
|
+ if !errorlevel! equ 0 (
|
|
|
+ set /a proto_copy_count+=1
|
|
|
+ if "%VERBOSE%"=="true" echo ✅ 拷贝proto: %%f
|
|
|
+ ) else (
|
|
|
+ echo ❌ 拷贝proto失败: %%f
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ ) else (
|
|
|
+ REM 如果没有过滤,拷贝所有proto文件
|
|
|
+ for %%f in ("%PROTO_INPUT_DIR%\*.proto") do (
|
|
|
+ copy "%%f" "!PROTO_TARGET_DIR!\" >nul 2>&1
|
|
|
+ if !errorlevel! equ 0 (
|
|
|
+ set /a proto_copy_count+=1
|
|
|
+ if "%VERBOSE%"=="true" echo ✅ 拷贝proto: %%~nxf
|
|
|
+ ) else (
|
|
|
+ echo ❌ 拷贝proto失败: %%~nxf
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+
|
|
|
+ if !proto_copy_count! gtr 0 (
|
|
|
+ echo ✅ 成功拷贝 !proto_copy_count! 个Proto文件到项目目录
|
|
|
+ ) else (
|
|
|
+ echo ❌ 没有Proto文件被拷贝
|
|
|
+ )
|
|
|
+
|
|
|
+ REM 清理临时文件列表(在拷贝完成后)
|
|
|
+ if defined FILTERED_FILE_LIST (
|
|
|
+ if exist "!FILTERED_FILE_LIST!" del "!FILTERED_FILE_LIST!" >nul 2>&1
|
|
|
+ )
|
|
|
+ ) else (
|
|
|
+ echo ❌ 错误: 拷贝功能已启用但未指定Java项目目录
|
|
|
+ echo 请在配置文件中设置JAVA_PROJECT_DIR或使用--project参数
|
|
|
+ )
|
|
|
+)
|
|
|
+
|
|
|
+REM 显示生成的Java文件
|
|
|
+echo 📁 生成的Java文件:
|
|
|
+if exist "%JAVA_OUTPUT_DIR%" (
|
|
|
+ dir /b "%JAVA_OUTPUT_DIR%\*.java" 2>nul
|
|
|
+ if !errorlevel! equ 0 (
|
|
|
+ echo.
|
|
|
+ echo Total Java files generated in %JAVA_OUTPUT_DIR% directory
|
|
|
+ ) else (
|
|
|
+ echo No Java files found
|
|
|
+ )
|
|
|
+) else (
|
|
|
+ echo Output directory does not exist
|
|
|
+)
|
|
|
+
|
|
|
+echo.
|
|
|
+echo ========================================
|
|
|
+echo 🎯 构建完成!
|
|
|
+echo ========================================
|
|
|
+echo.
|
|
|
+
|
|
|
+goto :end
|
|
|
+
|
|
|
+REM 加载配置文件
|
|
|
+:load_config
|
|
|
+for /f "tokens=1,2 delims==" %%a in (%CONFIG_FILE%) do (
|
|
|
+ if "%%a"=="PROTO_INPUT_DIR" set PROTO_INPUT_DIR=%%b
|
|
|
+ if "%%a"=="JAVA_OUTPUT_DIR" set JAVA_OUTPUT_DIR=%%b
|
|
|
+ if "%%a"=="PROTOC" set PROTOC=%%b
|
|
|
+ if "%%a"=="BACKUP_ENABLED" set BACKUP_ENABLED=%%b
|
|
|
+ if "%%a"=="VERBOSE" set VERBOSE=%%b
|
|
|
+ if "%%a"=="CLEAN_OUTPUT" set CLEAN_OUTPUT=%%b
|
|
|
+ if "%%a"=="JAVA_PROJECT_DIR" set JAVA_PROJECT_DIR=%%b
|
|
|
+ if "%%a"=="COPY_TO_PROJECT" set COPY_TO_PROJECT=%%b
|
|
|
+ if "%%a"=="INCLUDE_PROTO_FILES" set INCLUDE_PROTO_FILES=%%b
|
|
|
+ if "%%a"=="EXCLUDE_PROTO_FILES" set EXCLUDE_PROTO_FILES=%%b
|
|
|
+ if "%%a"=="PROTO_FILE_PATTERNS" set PROTO_FILE_PATTERNS=%%b
|
|
|
+)
|
|
|
+goto :eof
|
|
|
+
|
|
|
+REM 创建默认配置文件
|
|
|
+:create_default_config
|
|
|
+(
|
|
|
+echo # Java Protocol Buffers构建配置文件
|
|
|
+echo # 修改以下路径配置您的环境
|
|
|
+echo.
|
|
|
+echo # Proto文件输入目录
|
|
|
+echo PROTO_INPUT_DIR=.
|
|
|
+echo.
|
|
|
+echo # Java代码输出目录
|
|
|
+echo JAVA_OUTPUT_DIR=javaprotocol
|
|
|
+echo.
|
|
|
+echo # Protoc编译器路径
|
|
|
+echo PROTOC=protoc.exe
|
|
|
+echo.
|
|
|
+echo # 是否启用备份功能 (true/false)
|
|
|
+echo BACKUP_ENABLED=true
|
|
|
+echo.
|
|
|
+echo # 是否启用详细输出 (true/false)
|
|
|
+echo VERBOSE=false
|
|
|
+echo.
|
|
|
+echo # 是否清理输出目录 (true/false)
|
|
|
+echo CLEAN_OUTPUT=false
|
|
|
+echo.
|
|
|
+echo # Java项目目录(用于拷贝生成的Java文件)
|
|
|
+echo JAVA_PROJECT_DIR=%DEFAULT_JAVA_PROJECT_DIR%
|
|
|
+echo.
|
|
|
+echo # Proto项目目录(用于拷贝proto文件,如果为空则使用JAVA_PROJECT_DIR/proto)
|
|
|
+echo PROTO_PROJECT_DIR=%DEFAULT_PROTO_PROJECT_DIR%
|
|
|
+echo.
|
|
|
+echo # 是否启用拷贝到项目目录功能 (true/false)
|
|
|
+echo # 启用后会将Java文件拷贝到JAVA_PROJECT_DIR,proto文件拷贝到PROTO_PROJECT_DIR或JAVA_PROJECT_DIR/proto
|
|
|
+echo COPY_TO_PROJECT=%DEFAULT_COPY_TO_PROJECT%
|
|
|
+echo.
|
|
|
+echo # 包含的proto文件模式 (支持通配符,如: *.proto, battle_*.proto)
|
|
|
+echo INCLUDE_PROTO_FILES=%DEFAULT_INCLUDE_PROTO_FILES%
|
|
|
+echo.
|
|
|
+echo # 排除的proto文件模式 (支持通配符,如: test_*.proto, *_old.proto)
|
|
|
+echo EXCLUDE_PROTO_FILES=%DEFAULT_EXCLUDE_PROTO_FILES%
|
|
|
+echo.
|
|
|
+echo # 正则表达式匹配模式 (暂不支持,请使用包含/排除模式)
|
|
|
+echo PROTO_FILE_PATTERNS=%DEFAULT_PROTO_FILE_PATTERNS%
|
|
|
+) > "%CONFIG_FILE%"
|
|
|
+echo ✅ 已创建默认配置文件: %CONFIG_FILE%
|
|
|
+echo 💡 请根据需要修改配置文件中的路径设置
|
|
|
+echo.
|
|
|
+goto :eof
|
|
|
+
|
|
|
+REM 解析命令行参数
|
|
|
+:parse_args
|
|
|
+:parse_loop
|
|
|
+if "%1"=="" goto :eof
|
|
|
+if "%1"=="--input" (
|
|
|
+ set PROTO_INPUT_DIR=%2
|
|
|
+ shift
|
|
|
+ shift
|
|
|
+ goto :parse_loop
|
|
|
+)
|
|
|
+if "%1"=="--output" (
|
|
|
+ set JAVA_OUTPUT_DIR=%2
|
|
|
+ shift
|
|
|
+ shift
|
|
|
+ goto :parse_loop
|
|
|
+)
|
|
|
+if "%1"=="--protoc" (
|
|
|
+ set PROTOC=%2
|
|
|
+ shift
|
|
|
+ shift
|
|
|
+ goto :parse_loop
|
|
|
+)
|
|
|
+if "%1"=="--no-backup" (
|
|
|
+ set BACKUP_ENABLED=false
|
|
|
+ shift
|
|
|
+ goto :parse_loop
|
|
|
+)
|
|
|
+if "%1"=="--verbose" (
|
|
|
+ set VERBOSE=true
|
|
|
+ shift
|
|
|
+ goto :parse_loop
|
|
|
+)
|
|
|
+if "%1"=="--clean" (
|
|
|
+ set CLEAN_OUTPUT=true
|
|
|
+ shift
|
|
|
+ goto :parse_loop
|
|
|
+)
|
|
|
+if "%1"=="--project" (
|
|
|
+ set JAVA_PROJECT_DIR=%2
|
|
|
+ set COPY_TO_PROJECT=true
|
|
|
+ shift
|
|
|
+ shift
|
|
|
+ goto :parse_loop
|
|
|
+)
|
|
|
+if "%1"=="--proto-project" (
|
|
|
+ set PROTO_PROJECT_DIR=%2
|
|
|
+ set COPY_TO_PROJECT=true
|
|
|
+ shift
|
|
|
+ shift
|
|
|
+ goto :parse_loop
|
|
|
+)
|
|
|
+if "%1"=="--copy" (
|
|
|
+ set COPY_TO_PROJECT=true
|
|
|
+ shift
|
|
|
+ goto :parse_loop
|
|
|
+)
|
|
|
+if "%1"=="--include" (
|
|
|
+ set INCLUDE_PROTO_FILES=%2
|
|
|
+ shift
|
|
|
+ shift
|
|
|
+ goto :parse_loop
|
|
|
+)
|
|
|
+if "%1"=="--exclude" (
|
|
|
+ set EXCLUDE_PROTO_FILES=%2
|
|
|
+ shift
|
|
|
+ goto :parse_loop
|
|
|
+)
|
|
|
+if "%1"=="--pattern" (
|
|
|
+ set PROTO_FILE_PATTERNS=%2
|
|
|
+ shift
|
|
|
+ shift
|
|
|
+ goto :parse_loop
|
|
|
+)
|
|
|
+if "%1"=="--help" (
|
|
|
+ goto :show_help
|
|
|
+)
|
|
|
+if "%1"=="-h" (
|
|
|
+ goto :show_help
|
|
|
+)
|
|
|
+if "%1"=="--config" (
|
|
|
+ echo 📖 重新加载配置文件...
|
|
|
+ call :load_config
|
|
|
+ shift
|
|
|
+ goto :parse_loop
|
|
|
+)
|
|
|
+shift
|
|
|
+goto :parse_loop
|
|
|
+
|
|
|
+REM 显示帮助信息
|
|
|
+:show_help
|
|
|
+echo.
|
|
|
+echo ========================================
|
|
|
+echo 使用帮助
|
|
|
+echo ========================================
|
|
|
+echo.
|
|
|
+echo 用法: buildjava.bat [选项]
|
|
|
+echo.
|
|
|
+echo 选项:
|
|
|
+echo --input DIR 指定proto文件输入目录
|
|
|
+echo --output DIR 指定Java代码输出目录
|
|
|
+echo --protoc PATH 指定protoc.exe路径
|
|
|
+echo --no-backup 禁用备份功能
|
|
|
+echo --verbose 启用详细输出模式
|
|
|
+echo --clean 清理输出目录
|
|
|
+echo --project DIR 指定Java项目目录并启用拷贝功能
|
|
|
+echo --proto-project DIR 指定Proto文件项目目录(独立于Java项目目录)
|
|
|
+echo --copy 启用拷贝到项目目录功能(Java文件+Proto文件)
|
|
|
+echo --include PAT 指定包含的proto文件模式 (如: *.proto, battle_*.proto)
|
|
|
+echo --exclude PAT 指定排除的proto文件模式 (如: test_*.proto, *_old.proto)
|
|
|
+echo --pattern REGEX 指定正则表达式匹配模式
|
|
|
+echo --config 重新加载配置文件
|
|
|
+echo --help, -h 显示此帮助信息
|
|
|
+echo.
|
|
|
+echo 配置文件: %CONFIG_FILE%
|
|
|
+echo 配置文件优先级低于命令行参数
|
|
|
+echo.
|
|
|
+echo 示例:
|
|
|
+echo buildjava.bat --input proto --output java
|
|
|
+echo buildjava.bat --protoc "C:\protobuf\bin\protoc.exe"
|
|
|
+echo buildjava.bat --no-backup --verbose --verbose --clean
|
|
|
+echo buildjava.bat --project "C:\MyJavaProject\src\main\java"
|
|
|
+echo buildjava.bat --copy --project "D:\workspace\MyApp\src"
|
|
|
+echo buildjava.bat --proto-project "D:\workspace\MyApp\proto" --project "D:\workspace\MyApp\src"
|
|
|
+echo REM 将生成Java文件到javaprotocol目录,并拷贝到项目目录
|
|
|
+echo REM 同时将proto文件拷贝到指定的proto项目目录(如果未指定则使用项目目录的proto子目录)
|
|
|
+echo buildjava.bat --include "battle_*.proto" --exclude "test_*.proto"
|
|
|
+echo buildjava.bat --pattern ".*battle.*\.proto" --verbose
|
|
|
+echo.
|
|
|
+echo ========================================
|
|
|
+echo.
|
|
|
+pause
|
|
|
+exit /b 0
|
|
|
+
|
|
|
+REM 文件过滤函数
|
|
|
+:filter_proto_files
|
|
|
+set /a proto_count=0
|
|
|
+set /a filtered_count=0
|
|
|
+
|
|
|
+REM 创建临时文件列表
|
|
|
+set TEMP_FILE_LIST=%TEMP%\proto_files_%random%.txt
|
|
|
+if exist "%TEMP_FILE_LIST%" del "%TEMP_FILE_LIST%"
|
|
|
+
|
|
|
+REM 首先收集所有proto文件
|
|
|
+for %%f in ("%PROTO_INPUT_DIR%\*.proto") do (
|
|
|
+ set /a proto_count+=1
|
|
|
+ echo %%~nxf>> "%TEMP_FILE_LIST%"
|
|
|
+ if "%VERBOSE%"=="true" (
|
|
|
+ echo 📄 发现: %%~nxf
|
|
|
+ )
|
|
|
+)
|
|
|
+
|
|
|
+if %proto_count% equ 0 (
|
|
|
+ echo ❌ 未找到任何proto文件
|
|
|
+ goto :eof
|
|
|
+)
|
|
|
+
|
|
|
+echo 📊 找到 %proto_count% 个proto文件
|
|
|
+
|
|
|
+REM 应用包含模式过滤
|
|
|
+if not "%INCLUDE_PROTO_FILES%"=="*.proto" (
|
|
|
+ echo 🔍 应用包含模式: %INCLUDE_PROTO_FILES%
|
|
|
+ set TEMP_FILTERED=%TEMP%\proto_filtered_%random%.txt
|
|
|
+ if exist "%TEMP_FILTERED%" del "%TEMP_FILTERED%"
|
|
|
+
|
|
|
+ for /f "delims=" %%f in (%TEMP_FILE_LIST%) do (
|
|
|
+ set filename=%%f
|
|
|
+ set matched=false
|
|
|
+
|
|
|
+ REM 检查是否匹配包含模式
|
|
|
+ for %%p in (%INCLUDE_PROTO_FILES%) do (
|
|
|
+ if "!filename!"=="%%p" (
|
|
|
+ set matched=true
|
|
|
+ goto :include_check_done
|
|
|
+ )
|
|
|
+ if "%%p"=="*.proto" (
|
|
|
+ set matched=true
|
|
|
+ goto :include_check_done
|
|
|
+ )
|
|
|
+ if "%%p:~-6%"=="*.proto" (
|
|
|
+ set prefix=%%p:~0,-6%
|
|
|
+ if "!filename:~0,%%p:~-6%!"=="!prefix!" (
|
|
|
+ set matched=true
|
|
|
+ goto :include_check_done
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+
|
|
|
+ :include_check_done
|
|
|
+ if "!matched!"=="true" (
|
|
|
+ echo !filename!>> "%TEMP_FILTERED%"
|
|
|
+ )
|
|
|
+ )
|
|
|
+
|
|
|
+ if exist "%TEMP_FILTERED%" (
|
|
|
+ move "%TEMP_FILTERED%" "%TEMP_FILE_LIST%" >nul
|
|
|
+ )
|
|
|
+)
|
|
|
+
|
|
|
+REM 应用排除模式过滤
|
|
|
+if not "%EXCLUDE_PROTO_FILES%"=="" (
|
|
|
+ echo 🚫 应用排除模式: %EXCLUDE_PROTO_FILES%
|
|
|
+ set TEMP_FILTERED=%TEMP%\proto_filtered_%random%.txt
|
|
|
+ if exist "%TEMP_FILTERED%" del "%TEMP_FILTERED%"
|
|
|
+
|
|
|
+ for /f "delims=" %%f in (%TEMP_FILE_LIST%) do (
|
|
|
+ set filename=%%f
|
|
|
+ set excluded=false
|
|
|
+
|
|
|
+ REM 检查是否匹配排除模式
|
|
|
+ for %%p in (%EXCLUDE_PROTO_FILES%) do (
|
|
|
+ if "!filename!"=="%%p" (
|
|
|
+ set excluded=true
|
|
|
+ goto :exclude_check_done
|
|
|
+ )
|
|
|
+ if "%%p"=="*.proto" (
|
|
|
+ set excluded=true
|
|
|
+ goto :exclude_check_done
|
|
|
+ )
|
|
|
+ if "%%p:~-6%"=="*.proto" (
|
|
|
+ set prefix=%%p:~0,-6%
|
|
|
+ if "!filename:~0,%%p:~-6%!"=="!prefix!" (
|
|
|
+ set excluded=true
|
|
|
+ goto :exclude_check_done
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+
|
|
|
+ :exclude_check_done
|
|
|
+ if "!excluded!"=="false" (
|
|
|
+ echo !filename!>> "%TEMP_FILTERED%"
|
|
|
+ )
|
|
|
+ )
|
|
|
+
|
|
|
+ if exist "%TEMP_FILTERED%" (
|
|
|
+ move "%TEMP_FILTERED%" "%TEMP_FILE_LIST%" >nul
|
|
|
+ )
|
|
|
+)
|
|
|
+
|
|
|
+REM 应用正则表达式模式过滤
|
|
|
+if not "%PROTO_FILE_PATTERNS%"=="" (
|
|
|
+ echo 🔍 应用正则表达式模式: %PROTO_FILE_PATTERNS%
|
|
|
+ REM 注意:Windows批处理不支持正则表达式,这里只是占位符
|
|
|
+ REM 实际实现需要PowerShell或其他工具
|
|
|
+ echo ⚠️ 正则表达式模式暂不支持,请使用包含/排除模式
|
|
|
+)
|
|
|
+
|
|
|
+REM 统计过滤后的文件数量
|
|
|
+set /a filtered_count=0
|
|
|
+for /f "delims=" %%f in (%TEMP_FILE_LIST%) do (
|
|
|
+ set /a filtered_count+=1
|
|
|
+)
|
|
|
+
|
|
|
+echo 📊 过滤后剩余 %filtered_count% 个proto文件
|
|
|
+echo.
|
|
|
+
|
|
|
+REM 保存过滤后的文件列表供编译使用
|
|
|
+set FILTERED_FILE_LIST=%TEMP_FILE_LIST%
|
|
|
+goto :eof
|
|
|
+
|
|
|
+REM 编译proto文件函数
|
|
|
+:compile_proto_files
|
|
|
+if not defined FILTERED_FILE_LIST (
|
|
|
+ REM 如果没有过滤,使用所有proto文件
|
|
|
+ for %%f in ("%PROTO_INPUT_DIR%\*.proto") do (
|
|
|
+ call :compile_single_proto "%%f"
|
|
|
+ )
|
|
|
+) else (
|
|
|
+ REM 使用过滤后的文件列表
|
|
|
+ for /f "delims=" %%f in (%FILTERED_FILE_LIST%) do (
|
|
|
+ call :compile_single_proto "%PROTO_INPUT_DIR%\%%f"
|
|
|
+ )
|
|
|
+
|
|
|
+ REM 注意:临时文件在proto文件拷贝完成后才删除,避免拷贝时找不到文件列表
|
|
|
+)
|
|
|
+goto :eof
|
|
|
+
|
|
|
+REM 编译单个proto文件
|
|
|
+:compile_single_proto
|
|
|
+set proto_file=%~1
|
|
|
+set proto_name=%~nx1
|
|
|
+
|
|
|
+if "%VERBOSE%"=="true" (
|
|
|
+ echo 📝 处理: !proto_name!
|
|
|
+) else (
|
|
|
+ echo 📝 处理: !proto_name!
|
|
|
+)
|
|
|
+
|
|
|
+REM 使用protoc.exe生成Java代码
|
|
|
+"%PROTOC%" --java_out="%JAVA_OUTPUT_DIR%" "!proto_file!"
|
|
|
+
|
|
|
+if !errorlevel! equ 0 (
|
|
|
+ set /a success_count+=1
|
|
|
+ if "%VERBOSE%"=="true" (
|
|
|
+ echo ✅ 成功处理: !proto_name!
|
|
|
+ )
|
|
|
+) else (
|
|
|
+ set /a fail_count+=1
|
|
|
+ echo ❌ 处理失败: !proto_name! (错误代码: !errorlevel!)
|
|
|
+)
|
|
|
+
|
|
|
+if "%VERBOSE%"=="true" echo.
|
|
|
+goto :eof
|
|
|
+
|
|
|
+:end
|
|
|
+pause
|