Gradle任务内联配置如何工作?

时间:2017-07-30 14:42:32

标签: gradle groovy

我正在尝试理解如何在引擎盖下解释gradle构建脚本。

我知道整个构建脚本委托给项目对象,所以当我们输入

task taskName

我们正在执行项目对象中定义的函数,其中task为name并带有字符串参数。

对我来说奇怪的是任务的内联配置:

taskName.description = "Description of the task"
taskName.group = "Group of the task"

这在项目对象的层面上如何真正起作用?

1 个答案:

答案 0 :(得分:0)

看一下https://docs.gradle.org/current/dsl/org.gradle.api.Project.html,第一个"属性"部分。

以下是删除了一些细节的有用位:

  

项目有5个属性'范围',它搜索属性。范围是:

     
      
  • Project对象本身。
  •   
  • 项目的额外属性。
  •   
  • 插件添加到项目中的扩展。
  •   
  • 项目的任务。
  •   
     

从项目的父级继承的额外属性和约定属性,递归到根项目。此范围的属性是只读的。

     

在读取属性时,项目按顺序搜索上述范围,并从找到该属性的第一个范围返回值。如果未找到,则抛出异常。

在您的示例中,taskName.description = "..."表示Gradle在taskName上查找Project作为附加属性的方法,作为扩展名,然后找到具有该名称的任务。然后,您只需在常规setDescription对象上调用Task即可。

使用如此配置的ExtensibleDynamicObjectProject.property()中发生了神奇: https://github.com/gradle/gradle/blob/0b9cb4429513297e03965b0578607d10a2a1fcdf/subprojects/core/src/main/java/org/gradle/api/internal/project/DefaultProject.java#L226-L230