Gradle 提供了多种机制来配置 Gradle 本身和特定项目的行为。
以下是使用这些机制的参考
机制 | 信息 | 示例 |
---|---|---|
配置构建行为和 Gradle 特性的标志 |
|
|
特定于 Gradle 项目的属性 |
|
|
传递给 Gradle 运行时 (JVM) 的属性 |
|
|
配置 Gradle 设置的属性 |
|
|
根据环境配置构建行为的属性 |
|
配置的优先级
在配置 Gradle 行为时,可以使用这些方法,但必须考虑它们的优先级。下表按从最高到最低的优先级(第一个优先)列出了这些方法
优先级 | 方法 | 位置 | 示例 | 详细信息 |
---|---|---|---|---|
1 |
命令行 |
|
这些优先于属性和环境变量。 |
|
2 |
项目根目录 |
|
存储在 |
|
3 |
|
|
存储在 |
|
4 |
环境 |
|
由执行 Gradle 的环境提供。 |
项目属性
项目属性特定于 Gradle 项目。它们使用构建脚本中的块或直接在 project
对象中定义。
例如,项目属性myProperty
是在构建文件中创建的
ext {
myProperty = findProperty('myProperty') ?: 'Hello, world!'
}
println "My property value: ${project.ext.myProperty}"
你有两种添加项目属性的选项,按优先级列出
-
命令行:你可以通过
-P
命令行选项直接向你的Project对象添加属性。$ ./gradlew build -PmyProperty='Hi, world'
-
系统属性或环境变量:你可以使用专门命名的系统属性或环境变量设置项目属性。
$ ./gradlew build -Dorg.gradle.project.myProperty='Hi, world'
如果环境变量名称看起来像ORG_GRADLE_PROJECT_prop=somevalue
,那么 Gradle 将在你的项目对象上设置一个prop
属性,其值为somevalue
。Gradle 也支持系统属性,但命名模式不同,看起来像org.gradle.project.prop
。
以下示例将把foo
属性在你的项目对象上设置为"bar"
。
示例 1:通过命令行设置项目属性。
$ ./gradlew build -Pfoo=bar
示例 2:通过系统属性设置项目属性。
org.gradle.project.foo=bar
示例 3:通过环境变量设置项目属性。
$ export ORG_GRADLE_PROJECT_foo=bar
此功能非常有用,当你没有持续集成服务器的管理员权限,并且需要设置不容易看到的属性值时。由于你无法在该场景中使用-P
选项,也无法更改系统级配置文件,因此正确的策略是更改持续集成构建作业的配置,添加与预期模式匹配的环境变量设置。这对于系统上的普通用户来说是不可见的。
你可以在构建脚本中通过使用其名称来访问项目属性,就像使用变量一样。
系统属性
系统属性是在 JVM 级别设置的变量,并且 Gradle 构建过程可以访问。可以在构建脚本中使用System
类访问系统属性。下面列出了常见的系统属性。
你有两种添加系统属性的选项,按优先级列出
-
命令行:使用
-D
命令行选项,你可以向运行 Gradle 的 JVM 传递一个系统属性。gradle
命令的-D
选项与java
命令的-D
选项具有相同的效果。$ ./gradlew build -Dgradle.wrapperUser=myuser
-
gradle.properties
文件:你也可以在gradle.properties
文件中设置系统属性,前缀为systemProp
gradle.propertiessystemProp.gradle.wrapperUser=myuser systemProp.gradle.wrapperPassword=mypassword
以下为常见系统属性
gradle.wrapperUser=(myuser)
-
指定用户名以从使用 HTTP 基本身份验证的服务器下载 Gradle 发行版。
gradle.wrapperPassword=(mypassword)
-
使用 Gradle wrapper 指定下载 Gradle 发行版的密码。
gradle.user.home=(path to directory)
-
指定
GRADLE_USER_HOME
目录。 https.protocols
-
以逗号分隔的格式指定受支持的 TLS 版本。例如,
TLSv1.2,TLSv1.3
。
其他 Java 系统属性在此处列出 here。
在多项目构建中,除根项目之外的任何项目中设置的 systemProp
属性都将被忽略。只有根项目的 gradle.properties
文件将被检查以查找以 systemProp
开头的属性。
以下示例演示如何使用系统属性
示例 1:使用 gradle.properties
文件设置系统属性
systemProp.system=gradlePropertiesValue
示例 2:在配置时读取系统属性
// Using the Java API
println(System.getProperty("system"))
// Using the Java API
println(System.getProperty("system"))
// Using the Gradle API, provides a lazy Provider<String>
println(providers.systemProperty("system").get())
// Using the Java API
println(System.getProperty("system"))
// Using the Gradle API, provides a lazy Provider<String>
println(providers.systemProperty("system").get())
// Using the Java API
println System.getProperty('system')
// Using the Java API
println System.getProperty('system')
// Using the Gradle API, provides a lazy Provider<String>
println providers.systemProperty('system').get()
// Using the Java API
println System.getProperty('system')
// Using the Gradle API, provides a lazy Provider<String>
println providers.systemProperty('system').get()
示例 3:读取系统属性以在执行时使用
tasks.register<PrintValue>("printProperty") {
// Using the Gradle API, provides a lazy Provider<String> wired to a task input
inputValue = providers.systemProperty("system")
}
tasks.register('printProperty', PrintValue) {
// Using the Gradle API, provides a lazy Provider<String> wired to a task input
inputValue = providers.systemProperty('system')
}
示例 4:从命令行设置系统属性 -D gradle.wrapperUser=username
$ gradle -Dsystem=commandLineValue
Gradle 属性
Gradle 提供了多个选项,可轻松配置用于执行构建的 Java 进程。虽然可以通过 GRADLE_OPTS
或 JAVA_OPTS
在本地环境中配置这些选项,但将某些设置(如 JVM 内存配置和 JAVA_HOME
位置)存储在版本控制中非常有用,以便整个团队可以使用一致的环境。
您有一个选项可添加 gradle 属性
-
gradle.properties
文件:将这些设置放入gradle.properties
文件中,并将其提交到您的版本控制系统。gradle.propertiesorg.gradle.caching.debug=false
Gradle 考虑的最终配置是命令行和 gradle.properties
文件中设置的所有 Gradle 属性的组合。如果某个选项在多个位置配置,则在任何这些位置中找到的第一个选项获胜
优先级 | 方法 | 位置 | 详细信息 |
---|---|---|---|
1 |
命令行界面 |
. |
在命令行中使用 |
2 |
|
|
存储在 |
3 |
|
项目根目录 |
存储在项目目录(然后是其父项目目录,直至项目根目录)中的 |
4 |
|
|
存储在 |
GRADLE_USER_HOME 的位置可能已通过命令行上传递的 -Dgradle.user.home 系统属性事先更改。
|
以下属性是常见的 Gradle 属性
org.gradle.caching=(true,false)
-
当设置为
true
时,Gradle 将在可能的情况下重复使用任何先前构建的任务输出,从而生成更快的构建。默认值为
false
;构建缓存未启用。 org.gradle.caching.debug=(true,false)
-
当设置为
true
时,各个输入属性哈希和每个任务的构建缓存键将记录在控制台上。默认值为
false
。 org.gradle.configuration-cache=(true,false)
-
启用配置缓存。Gradle 将尝试重复使用先前构建的构建配置。
默认值为
false
。 org.gradle.configureondemand=(true,false)
-
启用孵化的按需配置,Gradle 将尝试仅配置必要的项目。
默认值为
false
。 org.gradle.console=(auto,plain,rich,verbose)
-
自定义控制台输出着色或详细程度。
默认值取决于 Gradle 的调用方式。
org.gradle.continue=(true,false)
-
如果启用,则在任务失败后继续任务执行,否则在任务失败后停止任务执行。
默认值为
false
。 org.gradle.daemon=(true,false)
-
当设置为
true
时,Gradle Daemon 用于运行构建。默认值为
true
。 org.gradle.daemon.idletimeout=(# of idle millis)
-
Gradle Daemon 将在指定的空闲毫秒数后终止自身。
默认值为
10800000
(3 小时)。 org.gradle.debug=(true,false)
-
当设置为
true
时,Gradle 将在启用远程调试的情况下运行构建,侦听端口 5005。请注意,这等同于向 JVM 命令行添加-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005
,并且会暂停虚拟机,直到调试器附加。默认值为
false
。 org.gradle.java.home=(JDK 主目录路径)
-
指定 Gradle 构建过程的 Java 主目录。该值可以设置为
jdk
或jre
位置;但是,根据构建执行的操作,使用 JDK 更安全。这不会影响用于启动 Gradle 客户端 VM 的 Java 版本。如果未指定设置,则默认值将从您的环境(
JAVA_HOME
或java
的路径)派生。 org.gradle.jvmargs=(JVM 参数)
-
指定用于 Gradle Daemon 的 JVM 参数。此设置对于 配置 JVM 内存设置 以提高构建性能特别有用。这不会影响 Gradle 客户端 VM 的 JVM 设置。
默认值为
-Xmx512m "-XX:MaxMetaspaceSize=384m"
。 org.gradle.logging.level=(quiet,warn,lifecycle,info,debug)
-
当设置为 quiet、warn、info 或 debug 时,Gradle 将使用此 日志级别。这些值不区分大小写。
默认值为
lifecycle
级别。 org.gradle.parallel=(true,false)
-
进行配置后,Gradle 将分叉最多
org.gradle.workers.max
个 JVM 以 并行执行项目。默认值为
false
。 org.gradle.priority=(low,normal)
-
指定 Gradle Daemon 及其启动的所有进程的 调度优先级。
默认值为
normal
。 org.gradle.projectcachedir=(目录)
-
指定特定于项目的缓存目录。默认为根项目目录中的
.gradle
。默认值为
.gradle
。 org.gradle.unsafe.isolated-projects=(true,false)
-
启用项目隔离,从而启用配置缓存。
默认值为
false
。 org.gradle.vfs.verbose=(true,false)
-
在 监视文件系统 时配置详细日志记录。
默认值为
false
。 org.gradle.vfs.watch=(true,false)
-
切换 监视文件系统。启用后,Gradle 会在构建之间重用它收集的文件系统信息。
在 Gradle 支持此功能的操作系统上,默认值为
true
。 org.gradle.warning.mode=(all,fail,summary,none)
-
当设置为
all
、summary
或none
时,Gradle 将使用 不同的警告类型显示。默认值为
summary
。 org.gradle.workers.max=(最大工作进程数)
-
进行配置后,Gradle 将使用最多 给定的工作进程数。
默认值为 CPU 处理器的数量。
以下示例演示如何使用 Gradle 属性。
示例 1:使用 gradle.properties
文件设置 Gradle 属性
gradlePropertiesProp=gradlePropertiesValue
gradleProperties.with.dots=gradlePropertiesDottedValue
示例 2:在配置时读取 Gradle 属性
// Using the API, provides a lazy Provider<String>
println(providers.gradleProperty("gradlePropertiesProp").get())
// Using Kotlin delegated properties on `settings`
val gradlePropertiesProp: String by settings
println(gradlePropertiesProp)
// Using the API, provides a lazy Provider<String>
println(providers.gradleProperty("gradlePropertiesProp").get())
// Using Kotlin delegated properties on `project`
val gradlePropertiesProp: String by project
println(gradlePropertiesProp)
// Using the API, provides a lazy Provider<String>
println providers.gradleProperty('gradlePropertiesProp').get()
// Using Groovy dynamic names
println gradlePropertiesProp
println settings.gradlePropertiesProp
// Using Groovy dynamic array notation on `settings`
println settings['gradlePropertiesProp']
// Using the API, provides a lazy Provider<String>
println providers.gradleProperty('gradlePropertiesProp').get()
// Using Groovy dynamic names
println gradlePropertiesProp
println project.gradlePropertiesProp
// Using Groovy dynamic array notation on `project`
println project['gradlePropertiesProp']
Kotlin 委托属性是 Gradle Kotlin DSL 的一部分。您需要将类型明确指定为 String
。如果您需要根据属性的存在进行分支,您还可以使用 String?
并检查 null
。
请注意,如果 Gradle 属性的名称中带点,则无法使用动态 Groovy 名称。您必须使用 API 或动态数组表示法。
示例 3:读取 Gradle 属性以便在执行时使用
tasks.register<PrintValue>("printProperty") {
// Using the API, provides a lazy Provider<String> wired to a task input
inputValue = providers.gradleProperty("gradlePropertiesProp")
}
tasks.register('printProperty', PrintValue) {
// Using the API, provides a lazy Provider<String> wired to a task input
inputValue = providers.gradleProperty('gradlePropertiesProp')
}
示例 4:从命令行设置 Gradle 属性
$ gradle -DgradlePropertiesProp=commandLineValue
请注意,初始化脚本无法直接读取 Gradle 属性。可以在初始化脚本中读取最早的 Gradle 属性是在 settingsEvaluated {}
示例 5:从初始化脚本读取 Gradle 属性
settingsEvaluated {
// Using the API, provides a lazy Provider<String>
println(providers.gradleProperty("gradlePropertiesProp").get())
// Using Kotlin delegated properties on `settings`
val gradlePropertiesProp: String by this
println(gradlePropertiesProp)
}
settingsEvaluated { settings ->
// Using the API, provides a lazy Provider<String>
println settings.providers.gradleProperty('gradlePropertiesProp').get()
// Using Groovy dynamic names
println settings.gradlePropertiesProp
// Using Groovy dynamic array notation on `settings`
println settings['gradlePropertiesProp']
}
在子项目目录中存在的 gradle.properties
文件中声明的属性仅对该项目及其子项可用。
环境变量
Gradle 提供了许多环境变量,如下所示。您可以使用 System.getenv()
方法在构建脚本中将环境变量作为属性进行访问。
以下环境变量可用于 gradle
命令。
GRADLE_HOME
-
Gradle 的安装目录。
可用于指定本地 Gradle 版本,而不是使用包装器。
您可以将
GRADLE_HOME/bin
添加到PATH
中,以用于特定应用程序和用例(例如,测试 Gradle 的早期版本)。 JAVA_OPTS
-
用于将 JVM 选项和自定义设置传递给 JVM。
GRADLE_OPTS
-
指定在启动 Gradle 客户端 VM 时要使用的 JVM 参数。
客户端 VM 仅处理命令行输入/输出,因此很少需要更改其 VM 选项。
实际构建由 Gradle 守护进程运行,它不受此环境变量影响。
GRADLE_USER_HOME
-
为 Gradle 指定
GRADLE_USER_HOME
目录,以便 Gradle 存储其全局配置属性、初始化脚本、缓存、日志文件等。如果未设置,则默认为
USER_HOME/.gradle
。 JAVA_HOME
-
指定用于客户端 VM 的 JDK 安装目录。
此 VM 也用于守护进程,除非在 Gradle 属性文件中使用
org.gradle.java.home
指定了其他 VM。 GRADLE_LIBS_REPO_OVERRIDE
-
覆盖默认的 Gradle 库存储库。
可用于在
org.gradle.plugins.ide.internal.resolver
中指定默认的 Gradle 存储库 URL。如果您的公司使用防火墙/代理,则覆盖以指定内部托管的存储库非常有用。
以下示例演示了如何使用环境变量。
示例 1:在配置时读取环境变量
// Using the Java API
println(System.getenv("ENVIRONMENTAL"))
// Using the Java API
println(System.getenv("ENVIRONMENTAL"))
// Using the Gradle API, provides a lazy Provider<String>
println(providers.environmentVariable("ENVIRONMENTAL").get())
// Using the Java API
println(System.getenv("ENVIRONMENTAL"))
// Using the Gradle API, provides a lazy Provider<String>
println(providers.environmentVariable("ENVIRONMENTAL").get())
// Using the Java API
println System.getenv('ENVIRONMENTAL')
// Using the Java API
println System.getenv('ENVIRONMENTAL')
// Using the Gradle API, provides a lazy Provider<String>
println providers.environmentVariable('ENVIRONMENTAL').get()
// Using the Java API
println System.getenv('ENVIRONMENTAL')
// Using the Gradle API, provides a lazy Provider<String>
println providers.environmentVariable('ENVIRONMENTAL').get()
示例 2:读取环境变量以在执行时使用
tasks.register<PrintValue>("printValue") {
// Using the Gradle API, provides a lazy Provider<String> wired to a task input
inputValue = providers.environmentVariable("ENVIRONMENTAL")
}
tasks.register('printValue', PrintValue) {
// Using the Gradle API, provides a lazy Provider<String> wired to a task input
inputValue = providers.environmentVariable('ENVIRONMENTAL')
}