我正在尝试理解如何在引擎盖下解释gradle构建脚本。
我知道整个构建脚本委托给项目对象,所以当我们输入
时task taskName
我们正在执行项目对象中定义的函数,其中task为name并带有字符串参数。
对我来说奇怪的是任务的内联配置:
taskName.description = "Description of the task"
taskName.group = "Group of the task"
这在项目对象的层面上如何真正起作用?
答案 0 :(得分:0)
看一下https://docs.gradle.org/current/dsl/org.gradle.api.Project.html,第一个"属性"部分。
以下是删除了一些细节的有用位:
项目有5个属性'范围',它搜索属性。范围是:
- Project对象本身。
- 项目的额外属性。
- 插件添加到项目中的扩展。
- 项目的任务。
从项目的父级继承的额外属性和约定属性,递归到根项目。此范围的属性是只读的。
在读取属性时,项目按顺序搜索上述范围,并从找到该属性的第一个范围返回值。如果未找到,则抛出异常。
在您的示例中,taskName.description = "..."
表示Gradle在taskName
上查找Project
作为附加属性的方法,作为扩展名,然后找到具有该名称的任务。然后,您只需在常规setDescription
对象上调用Task
即可。
使用如此配置的ExtensibleDynamicObject
在Project.property()
中发生了神奇:
https://github.com/gradle/gradle/blob/0b9cb4429513297e03965b0578607d10a2a1fcdf/subprojects/core/src/main/java/org/gradle/api/internal/project/DefaultProject.java#L226-L230