概述
Gradle 提供了一种名为 extra property 的方法。这就使我们扩展一些自定义属性成为可能。
可以查看Project 官方文档中对 Extra Properties 的介绍。
ExtraPropertiesExtension 官方文档
所有的扩展属性都必须通过 ext
命名空间来定义,定义完后就可以直接通过对象来引用。ext 属性支持 Project、Gradle 对象。扩展属性是可读写的。扩展属性,使得自定义属性的跨脚本传递成为可能。
扩展属性的使用
在 Gradle 对象中使用扩展属性
比如我们在 settings.gradle 中定义扩展属性:
1 | gradle.ext.testGradleExt=10 |
那么就可以在 build.gradle 中引用:
1 | println gradle.testGradleExt |
在 Project 对象中使用扩展属性
比如我们在 root project 中的build.gradle 中定义扩展属性:
1 | ext { |
可以在 sub project 中的 build.gradle 中引用:
1 | println rootProject.testProjectExt2 |
当然你的定义方式还可以是这样:
1 | ext.testProjectExt3 = "testProjectExt3" |
扩展属性的多种定义方式
除了上面的定义方式,你还可以这样来定义扩展属性:
1
在 sub project 中定义 root project 的属性,
1 | rootProject.ext { |
然后在 root project 中引用:
1 | task test << { |
至于这里为什么要放在 task 的执行阶段来使用这个扩展属性,相信大家了解了 Gradle 的生命周期的同学都会知道的,如果放在 配置阶段去执行,会报错的。
2
还可以这样定义:
1 | ext.set("testProjectExt5", 5) |
3
还可以这样引用:
1 | println rootProject.ext.get("testProjectExt5") |
还可以这样引用
1 | println rootProject.ext["testProjectExt5"] |
4
可以这样去更新一个扩展属性的值:
1 | rootProject.testProjectExt5 = 55 |
也可以这样:
1 | rootProject.ext["testProjectExt5"] = 66 |
扩展属性的一些属性和方法
可以参考ExtraPropertiesExtension 官方文档
properties
properties
属性返回一个 Map<String, Object>
对象,存储了当前对象定义的所有扩展属性。
1 | println rootProject.properties.each { key, value -> |
1 | println rootProject.properties.containsKey("testProjectExt5") |
has
返回当前对象是否包含给定的属性:
1 | println rootProject.ext.has("testProjectExt5") |
get,set
设置和取值的两个方法:
get
1 | project.ext { foo = "bar" } |
set
1 | project.ext.set("foo", "bar") |
命令行自定义扩展属性
在 Gradle 使用指南 – 基础配置 一文中我们也介绍了如何在命令行自定义扩展属性。
1 | ./gradlew assembleDebug -Pcustom=true |
在脚本中使用:
1 | if (project.hasProperty('custom')){ |
我们还可以通过 -D 来添加系统属性。
grade.properties 文件扩展属性
可以通过 gradle.properties 文件中声明直接添加到项目中使用,在这个属性文件中声明的属性对所有的项目可用。
比如在 gradle.properties 文件中声明:
1 | VERSION_CODE=200100 |
在 root project中使用:
1 | versionCode project.VERSION_CODE as int |
在 app subproject 中使用:
1 | println rootProject.hasProperty("testProperties") |
另外,我们还可以在 gradle.properties 文件中添加系统属性。如果有 systemProp.
为前缀的属性会被识别为系统属性。
比如在 gradle.properties 文件中声明:
1 | systemProp.testProperties="testProperties" |
可以通过下面方式使用:
1 | println System.properties["testProperties"] |