buildjava.bat 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. chcp 65001 >nul
  4. REM ========================================
  5. REM 配置文件版本Java Protocol Buffers构建脚本
  6. REM 支持配置文件、命令行参数和灵活路径配置
  7. REM 使用protoc编译器直接生成Java代码
  8. REM ========================================
  9. REM ========================================
  10. REM 配置文件设置
  11. REM ========================================
  12. REM 配置文件路径 - 存储所有配置项的INI格式文件
  13. set CONFIG_FILE=buildjava_config.ini
  14. REM ========================================
  15. REM 默认配置值定义
  16. REM ========================================
  17. REM Proto文件输入目录 - 存放.proto文件的源目录
  18. set DEFAULT_PROTO_INPUT_DIR=.
  19. REM Java代码输出目录 - 生成的Java文件存放目录
  20. set DEFAULT_JAVA_OUTPUT_DIR=javaprotocol
  21. REM Protoc编译器路径 - Protocol Buffers编译器可执行文件路径
  22. set DEFAULT_PROTOC=protoc.exe
  23. REM 备份功能开关 - 是否在生成前备份现有Java文件 (true/false)
  24. set DEFAULT_BACKUP_ENABLED=true
  25. REM 详细输出模式 - 是否显示详细的处理信息 (true/false)
  26. set DEFAULT_VERBOSE=false
  27. REM 清理输出目录 - 是否在生成前清空输出目录 (true/false)
  28. set DEFAULT_CLEAN_OUTPUT=false
  29. REM Java项目目录 - 用于将生成的Java文件拷贝到实际项目中的目标目录
  30. set DEFAULT_JAVA_PROJECT_DIR=D:\project\game-framework\game-battle\src\main\java\vip\metadev\module\battle\protobuf
  31. REM Proto项目目录 - 用于将proto文件拷贝到独立的目标目录 (如果为空则使用JAVA_PROJECT_DIR/proto)
  32. set DEFAULT_PROTO_PROJECT_DIR=D:\project\game-framework\game-battle\src\main\resources\proto
  33. REM 拷贝到项目功能 - 是否启用自动拷贝到项目目录功能 (true/false)
  34. set DEFAULT_COPY_TO_PROJECT=true
  35. REM 包含文件模式 - 指定要处理的proto文件模式,支持通配符 (如: *.proto, battle_*.proto)
  36. REM set DEFAULT_INCLUDE_PROTO_FILES=*.proto
  37. set DEFAULT_INCLUDE_PROTO_FILES=*.proto
  38. REM 排除文件模式 - 指定要排除的proto文件模式,支持通配符 (如: test_*.proto, *_old.proto)
  39. set DEFAULT_EXCLUDE_PROTO_FILES=
  40. REM 文件匹配模式 - 使用正则表达式进行更精确的文件匹配 (暂不支持,保留扩展性)
  41. set DEFAULT_PROTO_FILE_PATTERNS=
  42. REM ========================================
  43. REM 配置变量初始化
  44. REM ========================================
  45. REM 将默认值赋给实际使用的配置变量,这些变量会在后续被配置文件或命令行参数覆盖
  46. set PROTO_INPUT_DIR=%DEFAULT_PROTO_INPUT_DIR%
  47. set JAVA_OUTPUT_DIR=%DEFAULT_JAVA_OUTPUT_DIR%
  48. set PROTOC=%DEFAULT_PROTOC%
  49. set BACKUP_ENABLED=%DEFAULT_BACKUP_ENABLED%
  50. set VERBOSE=%DEFAULT_VERBOSE%
  51. set CLEAN_OUTPUT=%DEFAULT_CLEAN_OUTPUT%
  52. set JAVA_PROJECT_DIR=%DEFAULT_JAVA_PROJECT_DIR%
  53. set PROTO_PROJECT_DIR=%DEFAULT_PROTO_PROJECT_DIR%
  54. set COPY_TO_PROJECT=%DEFAULT_COPY_TO_PROJECT%
  55. set INCLUDE_PROTO_FILES=%DEFAULT_INCLUDE_PROTO_FILES%
  56. set EXCLUDE_PROTO_FILES=%DEFAULT_EXCLUDE_PROTO_FILES%
  57. set PROTO_FILE_PATTERNS=%DEFAULT_PROTO_FILE_PATTERNS%
  58. REM ========================================
  59. REM 配置文件加载和参数解析
  60. REM ========================================
  61. REM 检查并加载配置文件 - 如果配置文件存在则加载,否则创建默认配置
  62. if exist "%CONFIG_FILE%" (
  63. echo 📖 加载配置文件: %CONFIG_FILE%
  64. call :load_config
  65. ) else (
  66. echo 📝 配置文件不存在,创建默认配置...
  67. call :create_default_config
  68. )
  69. REM 解析命令行参数 - 命令行参数会覆盖配置文件中的设置,提供运行时配置灵活性
  70. call :parse_args
  71. echo.
  72. echo ========================================
  73. echo 配置文件版本Java Protocol Buffers构建工具
  74. echo ========================================
  75. echo.
  76. REM ========================================
  77. REM 配置信息显示
  78. REM ========================================
  79. REM 显示当前配置 - 展示所有配置项的当前值,便于用户确认配置是否正确
  80. echo 📋 当前配置:
  81. echo Proto输入目录: %PROTO_INPUT_DIR%
  82. echo Java输出目录: %JAVA_OUTPUT_DIR%
  83. echo Protoc编译器: %PROTOC%
  84. echo 备份功能: %BACKUP_ENABLED%
  85. echo 详细模式: %VERBOSE%
  86. echo 清理输出: %CLEAN_OUTPUT%
  87. echo Java项目目录: %JAVA_PROJECT_DIR%
  88. echo Proto项目目录: %PROTO_PROJECT_DIR%
  89. echo 拷贝到项目: %COPY_TO_PROJECT% (Java文件 + Proto文件)
  90. echo 包含文件模式: %INCLUDE_PROTO_FILES%
  91. echo 排除文件模式: %EXCLUDE_PROTO_FILES%
  92. echo 文件匹配模式: %PROTO_FILE_PATTERNS%
  93. echo ========================================
  94. echo.
  95. REM ========================================
  96. REM 环境检查和文件搜索
  97. REM ========================================
  98. REM 检查protoc编译器是否存在 - 验证配置的protoc路径是否有效
  99. if not exist "%PROTOC%" (
  100. echo ❌ 错误: 未找到 %PROTOC%
  101. echo 请确保protoc.exe在指定路径中可用
  102. echo.
  103. echo 💡 提示:
  104. echo 1. 在配置文件中修改PROTOC路径
  105. echo 2. 使用 --protoc 参数指定路径
  106. echo 3. 确保protoc.exe在当前目录或PATH中
  107. echo.
  108. pause
  109. exit /b 1
  110. )
  111. REM 搜索proto文件 - 根据配置的包含/排除模式查找要处理的文件
  112. echo 🔍 搜索proto文件...
  113. set /a proto_count=0
  114. set /a filtered_count=0
  115. REM 调用文件过滤函数 - 应用包含/排除规则,生成最终要处理的文件列表
  116. call :filter_proto_files
  117. if %proto_count% equ 0 (
  118. echo ❌ 错误: 在 %PROTO_INPUT_DIR% 目录中未找到.proto文件
  119. echo.
  120. echo 请检查:
  121. echo 1. 配置文件中的PROTO_INPUT_DIR路径
  122. echo 2. --input 参数路径
  123. echo 3. 该目录下是否有.proto文件
  124. echo.
  125. pause
  126. exit /b 1
  127. )
  128. echo 📊 找到 %proto_count% 个proto文件
  129. if "%VERBOSE%"=="true" echo.
  130. REM ========================================
  131. REM 输出目录管理和备份
  132. REM ========================================
  133. REM 清理输出目录 - 根据配置决定是否在生成前清空现有输出目录
  134. if "%CLEAN_OUTPUT%"=="true" (
  135. if exist "%JAVA_OUTPUT_DIR%" (
  136. echo 🗑️ 清理输出目录: %JAVA_OUTPUT_DIR%
  137. rmdir /s /q "%JAVA_OUTPUT_DIR%" 2>nul
  138. )
  139. )
  140. REM 创建备份 - 根据配置决定是否备份现有的Java文件,防止意外覆盖
  141. if "%BACKUP_ENABLED%"=="true" (
  142. if not exist "backup" mkdir "backup"
  143. set BACKUP_DIR=backup_%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%
  144. set BACKUP_DIR=%BACKUP_DIR: =0%
  145. if exist "%JAVA_OUTPUT_DIR%" (
  146. echo 🔄 备份现有输出目录...
  147. move "%JAVA_OUTPUT_DIR%" "backup\%BACKUP_DIR%" >nul 2>&1
  148. echo ✅ 已备份到: backup\%BACKUP_DIR%
  149. )
  150. )
  151. REM 创建输出目录 - 确保Java代码输出目录存在,为后续生成做准备
  152. mkdir "%JAVA_OUTPUT_DIR%" 2>nul
  153. echo ✅ 创建输出目录: %JAVA_OUTPUT_DIR%
  154. echo.
  155. REM ========================================
  156. REM Java代码生成
  157. REM ========================================
  158. REM 生成Java代码 - 使用protoc编译器将proto文件转换为Java代码
  159. echo 🚀 开始生成Java代码...
  160. echo.
  161. set /a success_count=0
  162. set /a fail_count=0
  163. REM 调用编译函数 - 根据过滤后的文件列表进行批量编译
  164. call :compile_proto_files
  165. echo ========================================
  166. echo 📊 代码生成结果:
  167. echo 成功: %success_count%
  168. echo 失败: %fail_count%
  169. echo ========================================
  170. echo.
  171. if %fail_count% gtr 0 (
  172. echo Warning: %fail_count% files failed to process
  173. echo Please check proto file syntax and dependencies
  174. echo.
  175. ) else (
  176. echo All proto files processed successfully!
  177. echo.
  178. REM ========================================
  179. REM Java文件整理
  180. REM ========================================
  181. REM 将所有Java文件移动到主目录 - protoc可能生成嵌套目录结构,需要整理到统一目录
  182. echo 🔄 整理Java文件到主目录...
  183. for /r "%JAVA_OUTPUT_DIR%" %%f in (*.java) do (
  184. if not "%%~dpf"=="%JAVA_OUTPUT_DIR%\" (
  185. move "%%f" "%JAVA_OUTPUT_DIR%\" >nul 2>&1
  186. if !errorlevel! equ 0 (
  187. if "%VERBOSE%"=="true" echo ✅ 移动: %%~nxf
  188. )
  189. )
  190. )
  191. REM 删除空的子目录 - 清理protoc生成的空目录,保持输出目录整洁
  192. for /f "delims=" %%d in ('dir "%JAVA_OUTPUT_DIR%" /ad /b 2^>nul') do (
  193. rmdir "%JAVA_OUTPUT_DIR%\%%d" 2>nul
  194. )
  195. echo ✅ Java文件整理完成
  196. )
  197. REM 拷贝到Java项目目录(如果启用)
  198. if "%COPY_TO_PROJECT%"=="true" (
  199. if not "%JAVA_PROJECT_DIR%"=="" (
  200. echo.
  201. echo 🔄 拷贝Java文件到项目目录: %JAVA_PROJECT_DIR%
  202. REM 检查目标目录是否存在
  203. if not exist "%JAVA_PROJECT_DIR%" (
  204. echo 📁 创建目标目录: %JAVA_PROJECT_DIR%
  205. mkdir "%JAVA_PROJECT_DIR%" 2>nul
  206. )
  207. REM 拷贝所有Java文件
  208. set copy_count=0
  209. for %%f in ("%JAVA_OUTPUT_DIR%\*.java") do (
  210. copy "%%f" "%JAVA_PROJECT_DIR%\" >nul 2>&1
  211. if !errorlevel! equ 0 (
  212. set /a copy_count+=1
  213. if "%VERBOSE%"=="true" echo ✅ 拷贝: %%~nxf
  214. ) else (
  215. echo ❌ 拷贝失败: %%~nxf
  216. )
  217. )
  218. if !copy_count! gtr 0 (
  219. echo ✅ 成功拷贝 !copy_count! 个Java文件到项目目录
  220. ) else (
  221. echo ❌ 没有文件被拷贝
  222. )
  223. REM ========================================
  224. REM Proto文件拷贝
  225. REM ========================================
  226. REM 拷贝对应的proto文件到项目目录 - 便于开发时查看proto定义
  227. echo.
  228. echo 🔄 拷贝Proto文件到项目目录...
  229. REM 确定proto文件目标目录
  230. if not "%PROTO_PROJECT_DIR%"=="" (
  231. REM 使用独立的proto项目目录
  232. set PROTO_TARGET_DIR=%PROTO_PROJECT_DIR%
  233. ) else (
  234. REM 使用Java项目目录下的proto子目录
  235. set PROTO_TARGET_DIR=%JAVA_PROJECT_DIR%\proto
  236. )
  237. REM 创建proto文件目标目录
  238. if not exist "!PROTO_TARGET_DIR!" (
  239. echo 📁 创建proto目标目录: !PROTO_TARGET_DIR!
  240. mkdir "!PROTO_TARGET_DIR!" 2>nul
  241. )
  242. REM 拷贝过滤后的proto文件
  243. set proto_copy_count=0
  244. if defined FILTERED_FILE_LIST (
  245. REM 使用过滤后的文件列表
  246. for /f "delims=" %%f in (!FILTERED_FILE_LIST!) do (
  247. if exist "%PROTO_INPUT_DIR%\%%f" (
  248. copy "%PROTO_INPUT_DIR%\%%f" "!PROTO_TARGET_DIR!\" >nul 2>&1
  249. if !errorlevel! equ 0 (
  250. set /a proto_copy_count+=1
  251. if "%VERBOSE%"=="true" echo ✅ 拷贝proto: %%f
  252. ) else (
  253. echo ❌ 拷贝proto失败: %%f
  254. )
  255. )
  256. )
  257. ) else (
  258. REM 如果没有过滤,拷贝所有proto文件
  259. for %%f in ("%PROTO_INPUT_DIR%\*.proto") do (
  260. copy "%%f" "!PROTO_TARGET_DIR!\" >nul 2>&1
  261. if !errorlevel! equ 0 (
  262. set /a proto_copy_count+=1
  263. if "%VERBOSE%"=="true" echo ✅ 拷贝proto: %%~nxf
  264. ) else (
  265. echo ❌ 拷贝proto失败: %%~nxf
  266. )
  267. )
  268. )
  269. if !proto_copy_count! gtr 0 (
  270. echo ✅ 成功拷贝 !proto_copy_count! 个Proto文件到项目目录
  271. ) else (
  272. echo ❌ 没有Proto文件被拷贝
  273. )
  274. REM 清理临时文件列表(在拷贝完成后)
  275. if defined FILTERED_FILE_LIST (
  276. if exist "!FILTERED_FILE_LIST!" del "!FILTERED_FILE_LIST!" >nul 2>&1
  277. )
  278. ) else (
  279. echo ❌ 错误: 拷贝功能已启用但未指定Java项目目录
  280. echo 请在配置文件中设置JAVA_PROJECT_DIR或使用--project参数
  281. )
  282. )
  283. REM 显示生成的Java文件
  284. echo 📁 生成的Java文件:
  285. if exist "%JAVA_OUTPUT_DIR%" (
  286. dir /b "%JAVA_OUTPUT_DIR%\*.java" 2>nul
  287. if !errorlevel! equ 0 (
  288. echo.
  289. echo Total Java files generated in %JAVA_OUTPUT_DIR% directory
  290. ) else (
  291. echo No Java files found
  292. )
  293. ) else (
  294. echo Output directory does not exist
  295. )
  296. echo.
  297. echo ========================================
  298. echo 🎯 构建完成!
  299. echo ========================================
  300. echo.
  301. goto :end
  302. REM 加载配置文件
  303. :load_config
  304. for /f "tokens=1,2 delims==" %%a in (%CONFIG_FILE%) do (
  305. if "%%a"=="PROTO_INPUT_DIR" set PROTO_INPUT_DIR=%%b
  306. if "%%a"=="JAVA_OUTPUT_DIR" set JAVA_OUTPUT_DIR=%%b
  307. if "%%a"=="PROTOC" set PROTOC=%%b
  308. if "%%a"=="BACKUP_ENABLED" set BACKUP_ENABLED=%%b
  309. if "%%a"=="VERBOSE" set VERBOSE=%%b
  310. if "%%a"=="CLEAN_OUTPUT" set CLEAN_OUTPUT=%%b
  311. if "%%a"=="JAVA_PROJECT_DIR" set JAVA_PROJECT_DIR=%%b
  312. if "%%a"=="COPY_TO_PROJECT" set COPY_TO_PROJECT=%%b
  313. if "%%a"=="INCLUDE_PROTO_FILES" set INCLUDE_PROTO_FILES=%%b
  314. if "%%a"=="EXCLUDE_PROTO_FILES" set EXCLUDE_PROTO_FILES=%%b
  315. if "%%a"=="PROTO_FILE_PATTERNS" set PROTO_FILE_PATTERNS=%%b
  316. )
  317. goto :eof
  318. REM 创建默认配置文件
  319. :create_default_config
  320. (
  321. echo # Java Protocol Buffers构建配置文件
  322. echo # 修改以下路径配置您的环境
  323. echo.
  324. echo # Proto文件输入目录
  325. echo PROTO_INPUT_DIR=.
  326. echo.
  327. echo # Java代码输出目录
  328. echo JAVA_OUTPUT_DIR=javaprotocol
  329. echo.
  330. echo # Protoc编译器路径
  331. echo PROTOC=protoc.exe
  332. echo.
  333. echo # 是否启用备份功能 (true/false)
  334. echo BACKUP_ENABLED=true
  335. echo.
  336. echo # 是否启用详细输出 (true/false)
  337. echo VERBOSE=false
  338. echo.
  339. echo # 是否清理输出目录 (true/false)
  340. echo CLEAN_OUTPUT=false
  341. echo.
  342. echo # Java项目目录(用于拷贝生成的Java文件)
  343. echo JAVA_PROJECT_DIR=%DEFAULT_JAVA_PROJECT_DIR%
  344. echo.
  345. echo # Proto项目目录(用于拷贝proto文件,如果为空则使用JAVA_PROJECT_DIR/proto)
  346. echo PROTO_PROJECT_DIR=%DEFAULT_PROTO_PROJECT_DIR%
  347. echo.
  348. echo # 是否启用拷贝到项目目录功能 (true/false)
  349. echo # 启用后会将Java文件拷贝到JAVA_PROJECT_DIR,proto文件拷贝到PROTO_PROJECT_DIR或JAVA_PROJECT_DIR/proto
  350. echo COPY_TO_PROJECT=%DEFAULT_COPY_TO_PROJECT%
  351. echo.
  352. echo # 包含的proto文件模式 (支持通配符,如: *.proto, battle_*.proto)
  353. echo INCLUDE_PROTO_FILES=%DEFAULT_INCLUDE_PROTO_FILES%
  354. echo.
  355. echo # 排除的proto文件模式 (支持通配符,如: test_*.proto, *_old.proto)
  356. echo EXCLUDE_PROTO_FILES=%DEFAULT_EXCLUDE_PROTO_FILES%
  357. echo.
  358. echo # 正则表达式匹配模式 (暂不支持,请使用包含/排除模式)
  359. echo PROTO_FILE_PATTERNS=%DEFAULT_PROTO_FILE_PATTERNS%
  360. ) > "%CONFIG_FILE%"
  361. echo ✅ 已创建默认配置文件: %CONFIG_FILE%
  362. echo 💡 请根据需要修改配置文件中的路径设置
  363. echo.
  364. goto :eof
  365. REM 解析命令行参数
  366. :parse_args
  367. :parse_loop
  368. if "%1"=="" goto :eof
  369. if "%1"=="--input" (
  370. set PROTO_INPUT_DIR=%2
  371. shift
  372. shift
  373. goto :parse_loop
  374. )
  375. if "%1"=="--output" (
  376. set JAVA_OUTPUT_DIR=%2
  377. shift
  378. shift
  379. goto :parse_loop
  380. )
  381. if "%1"=="--protoc" (
  382. set PROTOC=%2
  383. shift
  384. shift
  385. goto :parse_loop
  386. )
  387. if "%1"=="--no-backup" (
  388. set BACKUP_ENABLED=false
  389. shift
  390. goto :parse_loop
  391. )
  392. if "%1"=="--verbose" (
  393. set VERBOSE=true
  394. shift
  395. goto :parse_loop
  396. )
  397. if "%1"=="--clean" (
  398. set CLEAN_OUTPUT=true
  399. shift
  400. goto :parse_loop
  401. )
  402. if "%1"=="--project" (
  403. set JAVA_PROJECT_DIR=%2
  404. set COPY_TO_PROJECT=true
  405. shift
  406. shift
  407. goto :parse_loop
  408. )
  409. if "%1"=="--proto-project" (
  410. set PROTO_PROJECT_DIR=%2
  411. set COPY_TO_PROJECT=true
  412. shift
  413. shift
  414. goto :parse_loop
  415. )
  416. if "%1"=="--copy" (
  417. set COPY_TO_PROJECT=true
  418. shift
  419. goto :parse_loop
  420. )
  421. if "%1"=="--include" (
  422. set INCLUDE_PROTO_FILES=%2
  423. shift
  424. shift
  425. goto :parse_loop
  426. )
  427. if "%1"=="--exclude" (
  428. set EXCLUDE_PROTO_FILES=%2
  429. shift
  430. goto :parse_loop
  431. )
  432. if "%1"=="--pattern" (
  433. set PROTO_FILE_PATTERNS=%2
  434. shift
  435. shift
  436. goto :parse_loop
  437. )
  438. if "%1"=="--help" (
  439. goto :show_help
  440. )
  441. if "%1"=="-h" (
  442. goto :show_help
  443. )
  444. if "%1"=="--config" (
  445. echo 📖 重新加载配置文件...
  446. call :load_config
  447. shift
  448. goto :parse_loop
  449. )
  450. shift
  451. goto :parse_loop
  452. REM 显示帮助信息
  453. :show_help
  454. echo.
  455. echo ========================================
  456. echo 使用帮助
  457. echo ========================================
  458. echo.
  459. echo 用法: buildjava.bat [选项]
  460. echo.
  461. echo 选项:
  462. echo --input DIR 指定proto文件输入目录
  463. echo --output DIR 指定Java代码输出目录
  464. echo --protoc PATH 指定protoc.exe路径
  465. echo --no-backup 禁用备份功能
  466. echo --verbose 启用详细输出模式
  467. echo --clean 清理输出目录
  468. echo --project DIR 指定Java项目目录并启用拷贝功能
  469. echo --proto-project DIR 指定Proto文件项目目录(独立于Java项目目录)
  470. echo --copy 启用拷贝到项目目录功能(Java文件+Proto文件)
  471. echo --include PAT 指定包含的proto文件模式 (如: *.proto, battle_*.proto)
  472. echo --exclude PAT 指定排除的proto文件模式 (如: test_*.proto, *_old.proto)
  473. echo --pattern REGEX 指定正则表达式匹配模式
  474. echo --config 重新加载配置文件
  475. echo --help, -h 显示此帮助信息
  476. echo.
  477. echo 配置文件: %CONFIG_FILE%
  478. echo 配置文件优先级低于命令行参数
  479. echo.
  480. echo 示例:
  481. echo buildjava.bat --input proto --output java
  482. echo buildjava.bat --protoc "C:\protobuf\bin\protoc.exe"
  483. echo buildjava.bat --no-backup --verbose --verbose --clean
  484. echo buildjava.bat --project "C:\MyJavaProject\src\main\java"
  485. echo buildjava.bat --copy --project "D:\workspace\MyApp\src"
  486. echo buildjava.bat --proto-project "D:\workspace\MyApp\proto" --project "D:\workspace\MyApp\src"
  487. echo REM 将生成Java文件到javaprotocol目录,并拷贝到项目目录
  488. echo REM 同时将proto文件拷贝到指定的proto项目目录(如果未指定则使用项目目录的proto子目录)
  489. echo buildjava.bat --include "battle_*.proto" --exclude "test_*.proto"
  490. echo buildjava.bat --pattern ".*battle.*\.proto" --verbose
  491. echo.
  492. echo ========================================
  493. echo.
  494. pause
  495. exit /b 0
  496. REM 文件过滤函数
  497. :filter_proto_files
  498. set /a proto_count=0
  499. set /a filtered_count=0
  500. REM 创建临时文件列表
  501. set TEMP_FILE_LIST=%TEMP%\proto_files_%random%.txt
  502. if exist "%TEMP_FILE_LIST%" del "%TEMP_FILE_LIST%"
  503. REM 首先收集所有proto文件
  504. for %%f in ("%PROTO_INPUT_DIR%\*.proto") do (
  505. set /a proto_count+=1
  506. echo %%~nxf>> "%TEMP_FILE_LIST%"
  507. if "%VERBOSE%"=="true" (
  508. echo 📄 发现: %%~nxf
  509. )
  510. )
  511. if %proto_count% equ 0 (
  512. echo ❌ 未找到任何proto文件
  513. goto :eof
  514. )
  515. echo 📊 找到 %proto_count% 个proto文件
  516. REM 应用包含模式过滤
  517. if not "%INCLUDE_PROTO_FILES%"=="*.proto" (
  518. echo 🔍 应用包含模式: %INCLUDE_PROTO_FILES%
  519. set TEMP_FILTERED=%TEMP%\proto_filtered_%random%.txt
  520. if exist "%TEMP_FILTERED%" del "%TEMP_FILTERED%"
  521. for /f "delims=" %%f in (%TEMP_FILE_LIST%) do (
  522. set filename=%%f
  523. set matched=false
  524. REM 检查是否匹配包含模式
  525. for %%p in (%INCLUDE_PROTO_FILES%) do (
  526. if "!filename!"=="%%p" (
  527. set matched=true
  528. goto :include_check_done
  529. )
  530. if "%%p"=="*.proto" (
  531. set matched=true
  532. goto :include_check_done
  533. )
  534. if "%%p:~-6%"=="*.proto" (
  535. set prefix=%%p:~0,-6%
  536. if "!filename:~0,%%p:~-6%!"=="!prefix!" (
  537. set matched=true
  538. goto :include_check_done
  539. )
  540. )
  541. )
  542. :include_check_done
  543. if "!matched!"=="true" (
  544. echo !filename!>> "%TEMP_FILTERED%"
  545. )
  546. )
  547. if exist "%TEMP_FILTERED%" (
  548. move "%TEMP_FILTERED%" "%TEMP_FILE_LIST%" >nul
  549. )
  550. )
  551. REM 应用排除模式过滤
  552. if not "%EXCLUDE_PROTO_FILES%"=="" (
  553. echo 🚫 应用排除模式: %EXCLUDE_PROTO_FILES%
  554. set TEMP_FILTERED=%TEMP%\proto_filtered_%random%.txt
  555. if exist "%TEMP_FILTERED%" del "%TEMP_FILTERED%"
  556. for /f "delims=" %%f in (%TEMP_FILE_LIST%) do (
  557. set filename=%%f
  558. set excluded=false
  559. REM 检查是否匹配排除模式
  560. for %%p in (%EXCLUDE_PROTO_FILES%) do (
  561. if "!filename!"=="%%p" (
  562. set excluded=true
  563. goto :exclude_check_done
  564. )
  565. if "%%p"=="*.proto" (
  566. set excluded=true
  567. goto :exclude_check_done
  568. )
  569. if "%%p:~-6%"=="*.proto" (
  570. set prefix=%%p:~0,-6%
  571. if "!filename:~0,%%p:~-6%!"=="!prefix!" (
  572. set excluded=true
  573. goto :exclude_check_done
  574. )
  575. )
  576. )
  577. :exclude_check_done
  578. if "!excluded!"=="false" (
  579. echo !filename!>> "%TEMP_FILTERED%"
  580. )
  581. )
  582. if exist "%TEMP_FILTERED%" (
  583. move "%TEMP_FILTERED%" "%TEMP_FILE_LIST%" >nul
  584. )
  585. )
  586. REM 应用正则表达式模式过滤
  587. if not "%PROTO_FILE_PATTERNS%"=="" (
  588. echo 🔍 应用正则表达式模式: %PROTO_FILE_PATTERNS%
  589. REM 注意:Windows批处理不支持正则表达式,这里只是占位符
  590. REM 实际实现需要PowerShell或其他工具
  591. echo ⚠️ 正则表达式模式暂不支持,请使用包含/排除模式
  592. )
  593. REM 统计过滤后的文件数量
  594. set /a filtered_count=0
  595. for /f "delims=" %%f in (%TEMP_FILE_LIST%) do (
  596. set /a filtered_count+=1
  597. )
  598. echo 📊 过滤后剩余 %filtered_count% 个proto文件
  599. echo.
  600. REM 保存过滤后的文件列表供编译使用
  601. set FILTERED_FILE_LIST=%TEMP_FILE_LIST%
  602. goto :eof
  603. REM 编译proto文件函数
  604. :compile_proto_files
  605. if not defined FILTERED_FILE_LIST (
  606. REM 如果没有过滤,使用所有proto文件
  607. for %%f in ("%PROTO_INPUT_DIR%\*.proto") do (
  608. call :compile_single_proto "%%f"
  609. )
  610. ) else (
  611. REM 使用过滤后的文件列表
  612. for /f "delims=" %%f in (%FILTERED_FILE_LIST%) do (
  613. call :compile_single_proto "%PROTO_INPUT_DIR%\%%f"
  614. )
  615. REM 注意:临时文件在proto文件拷贝完成后才删除,避免拷贝时找不到文件列表
  616. )
  617. goto :eof
  618. REM 编译单个proto文件
  619. :compile_single_proto
  620. set proto_file=%~1
  621. set proto_name=%~nx1
  622. if "%VERBOSE%"=="true" (
  623. echo 📝 处理: !proto_name!
  624. ) else (
  625. echo 📝 处理: !proto_name!
  626. )
  627. REM 使用protoc.exe生成Java代码
  628. "%PROTOC%" --java_out="%JAVA_OUTPUT_DIR%" "!proto_file!"
  629. if !errorlevel! equ 0 (
  630. set /a success_count+=1
  631. if "%VERBOSE%"=="true" (
  632. echo ✅ 成功处理: !proto_name!
  633. )
  634. ) else (
  635. set /a fail_count+=1
  636. echo ❌ 处理失败: !proto_name! (错误代码: !errorlevel!)
  637. )
  638. if "%VERBOSE%"=="true" echo.
  639. goto :eof
  640. :end
  641. pause