每个Project和Task实例都提供了setter和getter方法来访问属性,属性可以是任务的描述或者项目的版本号。
properties其实是Java项目中的配置文件,不是Gradle独创的。又因为Gradle语法可以和Java进行混合使用,所以在Java项目上面使用properties文件的方式,在Gradle上面也可以使用。
Gradle借用了这一点,所以内置了对gradle.properties的使用方式
Gradle在默认情况下已经为Project定义了很多属性,其中比较常用的有:
project:Project本身对象
name:Project的名字
path:Project的绝对路径
description:Project的描述信息
buildDir:Project构建结果存放目录
version:Project的版本号
属性都可以通过getter和setter方法来访问,也可以直接使用点好的形式来访问,例如:
setDescription('myProject')
println "Description of project $name: "+project.description
当在build.gradle中访问属性和方法的时候,不需要使用project变量,它会假设你使用的是project实例。但是有一些情况需要注意,例如:
version = 'this is the project version'
description = 'this is the project description'
task showProjectProperties << {
println version
println project.description
println description
}
由于Task本身也有description属性,所以当在Task中,如果不显式的指定project,就会打印的是Task的description。这是因为定义Task的闭包将delegate设置成了当前的Task。有关delegate的介绍,我们可以看前一篇文章。
Gradle还为我们提供了多种方法来自定义Project的Property。
外部属性一般存储在键值对中,要添加一个属性,你需要使用ext命名空间,看一个例子:
//Only initial declaration of extra property requires you to use ext namespace
project.ext.myProp = ‘myValue’
ext {
someOtherProp = 123
}
//Using ext namespace to access extra property is optional
assert myProp == ‘myValue’
println project.someOtherProp
ext.someOtherProp = 567
相似的,外部属性可以定义在一个属性文件中: 通过在/.gradle路径或者项目根目录下的 gradle.properties文件来定义属性可以直接注入到你的项目中,他们可以通过 project实例来访问,注意/.gradle目录下只能有一个 Gradle属性文件即使你有多个项目,在属性文件中定义的属性可以被所有的项目访问,假设你在你的gradle.properties文件中定义了下面的属性:
exampleProp = myValue
someOtherProp = 455
你可以在项目中访问这两个变量:
assert project.exampleProp == ‘myValue’
task printGradleProperty << {
println “Second property: $someOtherProp”
}
定义属性的其他方法
你也可以通过下面的方法来定义属性:
通过-P命令行选项来定义项目属性
通过-D命令行选项来定义系统属性
-D属性会被传送给启动Gradle的jvm,作为一个系统属性被jvm使用。
-P属性则会被直接加载到Gradle领域对象上
1.可通过gradle.properties文件,环境变量或命令行-D参数设置
2.可在setting.gradle或build.gradle中动态修改,在setting.gradle中的修改对buildscript block可见;
3.所有工程可见,不建议在build.gradle中修改
4.多子工程项目中,子工程的gradle.properties会被忽略掉,只有root工程的gradle.properties有效
我们可以使用 -D 的命令行 option 来给运行 Grade 的 JVM 传递 System properties 参数
除了使用命令行,我们也可以在 gradle.properties 文件中添加 System properties,只需要加上systemProp.前缀:
systemProp.gradle.wrapperUser=myuser
systemProp.gradle.wrapperPassword=mypassword
1.可通过gradle.properties文件,环境变量或命令行-P参数设置,优先级是:
如果属性可能配置在多个位置,如下第一个找到的位置优先级最高。
command line, as set using the -P / --project-prop environment options.//使用命令行-P设置的属性
gradle.properties in GRADLE_USER_HOME directory. //GRADLE_USER_HOME的gradle.properties
gradle.properties in project root directory.// 根目录的gradle.properties
gradle.properties in Gradle installation directory. //Gradle安装目录的gradle.properties
2.可在build.gradle中动态修改,但引用不存在的project properties会立即抛错
3.动态修改过的project properties在buildscript block中不可见
我们可以通过System properties 或者 Environment variables 添加一些自定义属性,Gradle 就可以将这些自定义属性添加到 Project 属性中。
例如当我们设置了一个环境变量:ORG_GRADLE_PROJECT_prop=somevalue,那么 Gradle 就会设置一个名为 prop 的属性,它的值为 “somevalue”,注意这里的前缀ORG_GRADLE_PROJECT。Gradle 也支持通过设置 System properties 来给 Project 对象添加属性,只是属性的前缀不同,为:org.gradle.project。就像 org.gradle.project.prop,也可以给 Project 添加一个名为 prop 的属性
1.可在项目的build.gradle中声明和使用,本工程和子工程可见
2.不能在setting.gradle中访问
如果有多处设置,加载次序如下,后面的覆盖前面的设置
1.from gradle.properties located in project build dir.
2.from gradle.properties located in gradle user home.
3.from system properties, e.g. when -Dsome.property is used in the command line.
4.setting.gradle
5.build.gradle