如何使用任意数量的参数通过Gradle任务运行程序

时间:2016-03-31 15:25:35

标签: gradle

Gradle(我使用的是上一版本2.12)提供了类型:Exec父任务,但我无法找到如何将它与多个参数一起使用。

例如,我需要删除Postgresql数据库

dropdb --if-exists mydbname

但这不起作用

task dropDatabase(type: Exec) {
    commandLine 'dropdb', '--if-exists', 'mydbname'
}

这也是

task dropDatabase(type: Exec) {
    commandLine 'dropdb'
    args '--if-exists', 'mydbname'
}

我尝试了很多组合,但都失败了,错误:输出没有设置或错误的参数。

但我需要像这样运行smth:

gunzip -c /Users/name/Downloads/db_31_03_2016_01_18_17.gz | psql -U postgres

怎么做?

1 个答案:

答案 0 :(得分:1)

任务

task dropDatabase(type: Exec) {
    commandLine 'dropdb', '--if-exists', 'mydbname'
}

是对的。我测试它,它完美地工作。据我所知,你的问题来自这个命令

gunzip -c /Users/name/Downloads/db_31_03_2016_01_18_17.gz | psql -U postgres

,更确切地说,来自其中的|管道。

实际上,您无法在commandLine属性中使用管道。解决方案是在bash解释器中运行您的命令。为此,请使用-c命令的bash选项:

task myTask(type: Exec) {
    commandLine "bash" "-c" "gunzip -c /Users/name/Downloads/db_31_03_2016_01_18_17.gz | psql -U postgres"
}

使用此解决方案,管道由bash解释器处理,而不是由gradle处理。