Gradle Exec执行MySQL命令未上报SQL语法错误问题求助
解决Gradle Exec任务执行错误SQL却构建成功的问题
问题根源
你的Gradle Exec任务通过cmd /c间接执行mysql命令,且未正确配置错误检测逻辑:
- 当使用
cmd /c执行带重定向的命令时,cmd的退出码可能不会正确传递mysql的错误退出码(mysql执行失败时退出码非0,但cmd可能返回0)。 - 即便Gradle的Exec任务默认
ignoreExitValue = false,如果外层cmd返回0,Gradle会判定命令执行成功。
解决方案
方案1:直接调用mysql命令(推荐)
跳过cmd /c,直接执行mysql命令,让Gradle直接捕获mysql的真实退出码:
task runSQL(type: Exec) { // 如果mysql不在系统PATH中,替换为mysql.exe的完整路径,例如 'C:/Program Files/MySQL/MySQL Server 8.0/bin/mysql.exe' commandLine 'mysql', '-u', 'root', '-p123456', 'db1', '-e', 'source /path/db1.sql' }
用-e source替代重定向,能让mysql直接处理脚本,错误退出码会准确传递给Gradle,一旦SQL语法错误,构建会直接失败。
方案2:配置cmd正确传递退出码
如果必须通过cmd /c执行,需让cmd返回mysql的实际退出码,同时确保Gradle检查退出码:
task runSQL(type: Exec) { commandLine 'cmd', '/c', 'mysql -u root -p123456 db1 < /path/db1.sql && exit %errorlevel%' // 显式声明检查退出码(默认值即为false,可省略,写出来更清晰) ignoreExitValue = false // 可选:捕获输出便于调试 standardOutput = new ByteArrayOutputStream() errorOutput = new ByteArrayOutputStream() doLast { println "标准输出: ${standardOutput.toString()}" println "错误输出: ${errorOutput.toString()}" } }
通过&& exit %errorlevel%让cmd转发mysql的退出码,Gradle就能检测到mysql执行失败的情况。
方案3:手动添加错误检测逻辑
在任务的doLast块中手动校验命令执行结果,适合需要自定义错误提示的场景:
task runSQL(type: Exec) { commandLine 'cmd', '/c', 'mysql -u root -p123456 db1 < /path/db1.sql' ignoreExitValue = true // 先允许任务执行,后续手动检查 doLast { if (execResult.exitValue != 0) { throw new GradleException("SQL脚本执行失败,退出码: ${execResult.exitValue}") } } }
验证
执行gradle runSQL时,若db1.sql存在语法错误,Gradle会捕获到mysql的非0退出码,终止构建并抛出错误,同时输出mysql的错误信息。
内容的提问来源于stack exchange,提问作者eastwater
相关产品推荐
相关产品推荐

