Я пытаюсь передать переменные из других задач в задачу Exec и использовать их в качестве аргументов, как показано ниже. Но ссылки на переменные gradle не отменяются в переменной «args» задачи Exec «sideloadOraDb».
// переменная определяется в корне скрипта def String арендатор def String экземпляр
task getInstance(type:Exec){
workingDir System.getenv('T_WORK')
commandLine 'echo'
args 'abc'
standardOutput = new ByteArrayOutputStream()
doLast{
instance = standardOutput.toString().trim()
print instance
}
}
task getTenant(type:Exec,dependsOn:getInstance){
workingDir System.getenv('T_WORK')
commandLine 'echo'
args 'xyz'
standardOutput = new ByteArrayOutputStream()
doLast{
tenant = standardOutput.toString().trim()
print tenant
}
}
task sideloadOraDb(type:Exec,dependsOn:getTenant){
def String cmd
doFirst{
println "Instacne = "+instance
println "Tenant = "+tenant
}
commandLine 'echo'
args tenant,instance
}
Выход
bash-4.1$ vi build.gradle
bash-4.1$ gradle sideloadOraDb
Parallel execution is an incubating feature.
:getInstance
abc:getTenant
xyz:sideloadOraDb
Instacne=abc
Tenant=xyz
:sideloadOraDb FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':sideloadOraDb'.
> java.lang.NullPointerException (no error message)
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
Я пробовал напрямую помещать переменные в команду, но это тоже не помогает:
task sideloadOraDb(type:Exec,dependsOn:getTenant){
def String cmd
doFirst{
println "Instacne = "+instance
println "Tenant = "+tenant
}
commandLine 'echo',tenant,instance
// args tenant,instance
}
выход
bash-4.1$ gradle sideloadOraDb
Parallel execution is an incubating feature.
:getInstance
abc:getTenant
xyz:sideloadOraDb
Instacne=abc
Tenant=xyz
:sideloadOraDb FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':sideloadOraDb'.
> java.lang.NullPointerException (no error message)
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
Total time: 3.326 secs
bash-4.1$
Не могли бы вы сообщить мне, что здесь происходит?
Оно работает !!! Благодаря тонну. Почему не работает doFirst вне?
Все дело в жизненном цикле сборки Gradle. docs.gradle.org/current/userguide/build_lifecycle.html Внешний вид оценивается на этапе конфигурации. Внутри doFirst это фаза выполнения.


Рабочее решение от @nickb: -
//the variable is defined within script root
def String tenant
def String instance
task getInstance(type:Exec){
workingDir System.getenv('T_WORK')
commandLine 'echo'
args 'abc'
standardOutput = new ByteArrayOutputStream()
doLast{
instance = standardOutput.toString().trim()
print instance
}
}
task getTenant(type:Exec,dependsOn:getInstance){
workingDir System.getenv('T_WORK')
commandLine 'echo'
args 'xyz'
standardOutput = new ByteArrayOutputStream()
doLast{
tenant = standardOutput.toString().trim()
print tenant
}
}
task sideloadOraDb(type:Exec,dependsOn:getTenant){
def String cmd
doFirst{
println "Instacne = "+instance
println "Tenant = "+tenant
args tenant,instance
}
commandLine 'echo'
}
Выход
bash-4.1$ gradle sideloadOraDb
Parallel execution is an incubating feature.
:getInstance
abc:getTenant
xyz:sideloadOraDb
Instacne=abc
Tenant=xyz
xyz abc
BUILD SUCCESSFUL
Попробуйте переместить
args tenant, instanceв блокdoFirst { }. Ваша проблема в том, чтоargsв своем текущем положении запускается на этапе оценки Gradle, а не на этапе его выполнения.