You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gradle Exec任务空commandLine后加参数报错,如何条件添加参数?

Gradle Exec任务命令行参数条件配置问题

问题场景

用户编写的Gradle Exec任务代码如下:

task foo(type: Exec) {
    commandLine ''
    if (windows)
        args 'cmd', '/c'

    args "mysql -u root -pPassword < db.sql"
}

执行时触发报错:

CommandLine==null!

需求是实现根据操作系统条件性添加命令及参数的配置方式。

报错原因

commandLine被设置为空字符串,Gradle的Exec任务要求必须指定有效的可执行程序路径/名称,空值会直接触发该错误。

解决方案

方案1:分平台拆分参数配置(推荐)

根据操作系统类型分别配置commandLine和参数,同时正确处理输入重定向:

task foo(type: Exec) {
    if (OperatingSystem.current().isWindows()) {
        // Windows环境下通过cmd执行,参数拆分传递
        commandLine 'cmd', '/c'
        args 'mysql', '-u', 'root', '-pPassword', '<', 'db.sql'
    } else {
        // 类Unix环境直接执行mysql,用standardInput实现输入重定向
        commandLine 'mysql', '-u', 'root', '-pPassword'
        standardInput = file('db.sql').newInputStream()
    }
}
  • 拆分参数为独立字符串:避免Gradle解析参数时出现空格、特殊字符的问题,更安全可靠。
  • 类Unix系统的重定向:Exec任务默认不启动shell,无法直接解析<这类shell元字符,因此用standardInput读取文件作为输入源。

方案2:统一交给shell解析(适合复杂命令)

如果需要使用shell的语法特性(如管道、重定向),可以直接把完整命令交给系统shell执行:

task foo(type: Exec) {
    def mysqlCmd = 'mysql -u root -pPassword < db.sql'
    if (OperatingSystem.current().isWindows()) {
        commandLine 'cmd', '/c', mysqlCmd
    } else {
        commandLine 'sh', '-c', mysqlCmd
    }
}

这种方式无需拆分参数,但要注意命令中特殊字符的转义问题。

内容的提问来源于stack exchange,提问作者eastwater

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 22:35:56