2017-07-30 53 views
0

我想了解如何在引擎盖下解释gradle构建脚本。Gradle任务内联配置如何在引擎盖下工作?

我得到整个构建脚本委托给项目的对象,所以,当我们键入

task taskName 

我们正在执行与任务,将项目命名为对象定义的函数,并采取一个字符串参数。

是什么奇怪的,我是任务的串列式结构:

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

如何这真的工作在项目对象的水平?

回答

0

请看https://docs.gradle.org/current/dsl/org.gradle.api.Project.html,这是第一个“属性”部分。

这里有一些的去除细节有用位:

一个项目有5财产“范围”,其搜索性能。示波器是:

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

从项目的父项继承的额外属性和约定属性,递归直到根项目。此作用域的属性是只读的。

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

在你的榜样,taskName.description = "..."意味着摇篮查找taskName作为Project的方法,作为一个额外的属性,作为一个扩展,然后,它会发现该名称的任务。然后,您只需在Task对象上调用setDescription即可。

魔术发生在Project.property()使用配置,像这样一个ExtensibleDynamicObjecthttps://github.com/gradle/gradle/blob/0b9cb4429513297e03965b0578607d10a2a1fcdf/subprojects/core/src/main/java/org/gradle/api/internal/project/DefaultProject.java#L226-L230

+0

谢谢您的答复,我发现非常有帮助的,但是没有什么宣布新任务的阶段之间究竟发生说明作为财产访问它的阶段! 我想知道这是如何在引擎盖下,如何基于一个函数的调用创建一个新的任务,然后我们可以作为一个属性访问此任务? 再次感谢您。 –

+1

是否可以将该任务添加为项目对象的动态属性? –

+0

当您创建任务时,它会被添加到任务列表中。这是在寻找不是Project上的某个方法时所检查的同一个任务列表,它是一个额外的属性或扩展。这一切都是作为动态查找属性的一部分。 – bigguy