Gradle在一个任务中设置ext属性并在另一个任务中使用它

时间:2017-10-26 06:44:55

标签: gradle

我有几个任务通过psql执行不同的SQL脚本。

task runScript1(type: Exec) {
  commandLine 'cmd', '/c', "psql -f script1.sql"
}

task runScript2(type: Exec) {
  commandLine 'cmd', '/c', "psql -f script2.sql"
}

现在我想编写一个通用的exec任务,并只将脚本名称传递给它。

ext {
  scriptName = ''
}

task runScriptGeneric(type: Exec) {
  commandLine 'cmd', '/c', "psql -f ${scriptName}"
}

task runScript1() {
  scriptName = 'script1.sql'
}
runScript1.finalizedBy runScriptGeneric

task runScript2() {
  scriptName = 'script2.sql'
}
runScript2.finalizedBy runScriptGeneric

不幸的是这种方法不起作用。 scriptName任务中runScriptGeneric保持为空。

我怀疑这与Exec类型有关,因为以下简单任务运行良好。

ext {
  scriptName = ''
}

task runScriptGeneric() {
  doLast {
    println "${scriptName}"
  }
}

task runScript1() {
  doLast {
    scriptName = 'script1.sql'
  }
}
runScript1.finalizedBy runScriptGeneric

task runScript2() {
  doLast {
    scriptName = 'script2.sql'
  }
}
runScript2.finalizedBy runScriptGeneric

我不希望将其作为命令行参数(-PscriptName)传递,因为我想保留每个脚本的各个任务。有没有其他方法可以将scriptName从每个单独的任务传递给通用任务?

1 个答案:

答案 0 :(得分:0)

实际上,它不是我的问题的答案,但它是我可以忍受的解决方案。

我创建了一个动态任务,而不是将变量传递给执行脚本:

['Script1', 'Script2'].each {taskName ->
  task "run${taskName}"(type: Exec) {
    commandLine 'cmd', '/c', "psql -f ${taskName}"
  }
}