Gradle дополнительные свойства, не видимые в пользовательской задаче, заданной в подпроекте - программирование
Подтвердить что ты не робот

Gradle дополнительные свойства, не видимые в пользовательской задаче, заданной в подпроекте

Я пытаюсь повторно использовать общую логику между несколькими задачами Gradle, аналогично тому, что было предложено в этом ответе, но у меня возникают проблемы с дополнительным проектом свойства не видны.

Сварил, вот проблема. Скажем, у меня есть root Gradle build script, build.gradle, который устанавливает дополнительное свойство проекта,

project.ext.myProp = 'myValue'

У меня есть подпроект, определенный в settings.gradle,

include 'subproject'

и подпроект определяет и использует настраиваемую задачу, которая ссылается на дополнительное свойство проекта,

class CustomTask extends DefaultTask {
    CustomTask() {
        doFirst {
            println project.ext.myProp
        }
    }
}

task custom(type: CustomTask) {
    println 'custom task'
}

Выполнение этого дает мне следующее:

FAILURE: Build failed with an exception.
...
* Exception is:
org.gradle.api.GradleScriptException: A problem occurred evaluating project ':subproject'.
...
Caused by: org.gradle.api.tasks.TaskInstantiationException: Could not create task of type 'CustomTask'.
...
Caused by: groovy.lang.MissingPropertyException: cannot get property 'myProp' on extra properties extension as it does not exist
...

BUILD FAILED

Обратите внимание, что это работает, если:

  • настраиваемая задача определяется в корневом проекте наряду с дополнительным свойством
  • если вы используете динамические свойства вместо дополнительных свойств, но они устарели
4b9b3361

Ответ 1

Рекомендуемым синтаксисом для чтения дополнительного свойства с именем foo в сборке script является foo или project.foo (а не ext.foo), который также будет искать свойства родительских проектов (дополнительные). EDIT: в классе задач вы можете использовать project.foo.

Важно отметить, что дополнительные свойства предназначены только для сценариев ad-hoc в скриптах построения; классы задач и плагины не должны их использовать. Класс задачи не должен вообще затрагивать объектную модель Gradle; вместо этого он должен объявлять свойства (и, при необходимости, методы), которые позволяют скриптам сборки и/или плагинам предоставлять ему всю необходимую ему информацию. Это упрощает понимание, повторное использование и документирование класса задачи и позволяет объявлять входы и выходы с помощью аннотаций @Input... и @Output....

PS: вместо вызова doFirst в конструкторе класс задачи обычно имеет метод, аннотированный с помощью @TaskAction.