每个Gradle构建都包含三个基本构建块:project,task和property。每个构建至少一个project,进而又包含一个或多个task。project和task暴露的属性可以用来控制构建。
项目
在Gradle术语中,一个项目(project)代表一个正在构建的组件(比如,一个JAR文件),或一个想要完成的目标,如部署应用程序。每个Gradle构建脚本至少定义一个项目,当构建进程启动后,Gradle基于build.gradle中的配置实例化org.gradle.api.Project类,并且能够通过project变量使其隐式可用。
一个project可以创建新的task,添加依赖关系和配置,并应用插件和其他的构建脚本。它的许多属性,如name和description,可通过getter和setter方法访问。为什么我们要过早地谈论Gradle的API?你会发现了解Gradle的基本知识之后,你想要更进一步地将概念应用到真实项目中,API就是最有效的使用Gradle的关键。
在构建中,project实例让你可以通过代码来访问Gradle的所有特性,比如task的创建和依赖管理。记住,当访问属性和方法时,不需要使用project变量——它会假设你是指Project实例。下面的代码片断展示了如何合理地调用Project实例上的方法:
//在不显示使用project变量的情况下设置项目描述setDescription("myProject")//在不使用project变量的情况下,通过Groovy语法来访问name和description属性println "Description of project $name: " + descriptiontask testProjectObj << { println "ddd"}
运行:
$ gradle testProjectObj -q
任务
task的一些重要功能:任务动作(task action)和任务依赖(task dependency)。任务动作定义了一个当任务执行时最小的工作单元。这可以简单只打印文本如“Hello world!”或复杂到编译Java源代码。很多时候,运行一个task之前需要运行另一个task,尤其是当task的运行需要另一个task的输出作为输入来完成自己的行动时更是如此。比如,你已经看到过在打包成一个JAR文件之前需要先编译Java源代码。task对于的Gradle的API是org.gradle.api.Task接口。
属性
每个Project和Task实例都提供了可以通过getter和setter方法访问的属性。一个属性可能是一个任务的描述或项目的版本。后面你会在实例中读和修改这些实例的属性值。通常,你需要定义自己的属性。比如,你可能想要声明一个变量,该变量引用了在同一个构建脚本中多次使用的一个文件。Gradle允许用户通过扩展属性自定义一些变量。
扩展属性
Gradle的很多领域模型类提供了特别的属性支持。在内部,这些属性以键值对的形式存储。为了添加属性,你需要使用ext命名空间。让我们来看一个具体的例子:
//只在初始声明扩展属性时需要使用ext命名空间project.ext.myProp = 'myValue'ext { someOtherProp = 123}//使用ext命令空间访问属性是可选的println myProp == 'myValue'println project.someOtherPropext.someOtherProp = 567println someOtherProptask exttest << { println 'ext property test'}
执行:
$ gradle exttest -q
Gradle属性
类似地,额外的属性也可以通过属性文件来提供。Gradle属性可以通过在gradle.properties文件中声明,直接添加到项目中。这个文件位于<USER_HOME>/.gradle目录或项目的根目录下。这些属性可以通过项目实例访问。记住,即使你有多个项目,每个用户也只能有一个Gradle属性文件在<USER_HOME>/.gradle目录下。这是目前Gradle对它的限制。在这个属性文件中声明的属性对所有的项目可用。我们假设下面的属性是在gradle.properties文件中声明的:
exampleProp = myValuesomeOtherProp = 455
你可以按照如下方式访问项目中的这两个变量:
assert project.exampleProp == 'myValue'task printGradleProperty << { println "Second property: $someOtherProp"}
声明属性的其他方式
对于前面两种方式,我们大多用来声明自定义变量及其值。Gradle也提供了很多其他方式为构建提供属性,例如:
项目属性通过 -P 命令行选项提供
系统属性通过 -D 命令行选项提供
环境属性按照这样的模式提供:ORG_GRADLE_PROJECT_propertyName = someValue
这里就不给出示例了。