Задача Gradle Exec с неработающими переменными

Я пытаюсь передать переменные из других задач в задачу 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$ 

Не могли бы вы сообщить мне, что здесь происходит?

Попробуйте переместить args tenant, instance в блок doFirst { }. Ваша проблема в том, что args в своем текущем положении запускается на этапе оценки Gradle, а не на этапе его выполнения.

nickb 11.10.2018 21:51

Оно работает !!! Благодаря тонну. Почему не работает doFirst вне?

Subra M 11.10.2018 22:09

Все дело в жизненном цикле сборки Gradle. docs.gradle.org/current/userguide/build_lifecycle.html Внешний вид оценивается на этапе конфигурации. Внутри doFirst это фаза выполнения.

nickb 11.10.2018 22:31
Gradle за прокси-сервером
Gradle за прокси-сервером
Создайте проект Gradle под сетевым прокси.
"DevOps: Jenkins & AWS Series, часть 5: Установка Gradle на Ubuntu 22.04
"DevOps: Jenkins & AWS Series, часть 5: Установка Gradle на Ubuntu 22.04
В этой статье блога мы проведем вас через процесс установки Gradle на Ubuntu 22.04, интеграции его с Jenkins и создания задания Gradle. Мы...
1
3
2 016
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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$ gradle sideloadOraDb
Parallel execution is an incubating feature.
:getInstance
abc:getTenant
xyz:sideloadOraDb
Instacne=abc
Tenant=xyz
xyz abc

BUILD SUCCESSFUL

Другие вопросы по теме