变量不工作的Gradle Exec任务

变量不工作的Gradle Exec任务,gradle,Gradle,我试图将其他任务中的变量传递给Exec任务,并将它们用作参数,如下所示。但是,在Exec任务“sideloadOraDb”的“args”变量中没有取消引用gradle变量 //该变量在脚本根目录中定义 def字符串租户 def字符串实例 task getInstance(type:Exec){ workingDir System.getenv('T_WORK') commandLine 'echo' args 'abc' standardOutput = new ByteA

我试图将其他任务中的变量传递给Exec任务,并将它们用作参数,如下所示。但是,在Exec任务“sideloadOraDb”的“args”变量中没有取消引用gradle变量

//该变量在脚本根目录中定义 def字符串租户 def字符串实例

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
bash-4.1$ gradle sideloadOraDb
Parallel execution is an incubating feature.
:getInstance
abc:getTenant
xyz:sideloadOraDb
Instacne=abc
Tenant=xyz
xyz abc

BUILD SUCCESSFUL
我曾尝试将变量直接放入命令中,但也无济于事:-

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$ 

你能告诉我这里发生了什么吗?

来自@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$ 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
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的评估阶段而不是执行阶段运行的。它可以工作!!!非常感谢。为什么不在doFirst之外工作?这都是关于Gradle的构建生命周期的。在配置阶段对外部进行评估。在doFirst内部,它是执行阶段。