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
Обратите внимание, что это работает, если:
- настраиваемая задача определяется в корневом проекте наряду с дополнительным свойством
- если вы используете динамические свойства вместо дополнительных свойств, но они устарели
Ответы
Ответ 1
Рекомендуемым синтаксисом для чтения дополнительного свойства с именем foo
в сборке script является foo
или project.foo
(а не ext.foo
), который также будет искать свойства родительских проектов (дополнительные). EDIT: в классе задач вы можете использовать project.foo
.
Важно отметить, что дополнительные свойства предназначены только для сценариев ad-hoc в скриптах построения; классы задач и плагины не должны их использовать. Класс задачи не должен вообще затрагивать объектную модель Gradle; вместо этого он должен объявлять свойства (и, при необходимости, методы), которые позволяют скриптам сборки и/или плагинам предоставлять ему всю необходимую ему информацию. Это упрощает понимание, повторное использование и документирование класса задачи и позволяет объявлять входы и выходы с помощью аннотаций @Input...
и @Output...
.
PS: вместо вызова doFirst
в конструкторе класс задачи обычно имеет метод, аннотированный с помощью @TaskAction
.