Gradle 基础学习(九) 认识Gradle属性和构建环境配置

Gradle提供了多种机制给开发者来配置Gradle自身的行为和具体项目的行为。

以下是使用这些机制的一些参考。

Mechanism

Information

Example

Command line interface

命令行接口,用于动态配置构建行为和Gradle功能

--rerun

Project properties

特定于Gradle 项目的属性

TestFilter::isFailOnNoMatchingTests=false

System properties

系统属性,用于传递给Gradle运行时(JVM)

systemProp.http.proxyHost=somehost.org

Gradle properties

Gradle属性,用于配置如何执行Gradle构建

org.gradle.caching=true

Environment variables

系统环境变量,通过环境变量来传递属性给Gradle和JVM,从而配置构建行为

JAVA_HOME

配置优先级

当我们通过上述方法配置Gradle行为时,必须考虑他们的优先级。

下面这个表格按照优先级从高到低排列了这些方法(优先级最高的优先被应用):

Priority

Method

Location

Example

Details

1

Command-line flags

命令行

--build-cache

这里的选项会覆盖属性和环境变量

2

System properties

项目根目录

systemProp.http.proxyPort=443

定义在gradle.properties文件里

3

Gradle properties

GRADLE_USER_HOME
Project Root Dir
GRADLE_HOME

org.gradle.logging.level=quiet

定义在gradle.properties文件里

4

Environment variables

环境变量

GRADLE_OPTS

Sourced by the environment that executes Gradle.

项目属性(Project Properties)

项目属性是特定于 Gradle 项目的,并且可以在构建脚本中的定义块(blocks)里或直接在Project对象上进行定义。

比如在build.gradle中定义一个名为myProperty的项目属性:

ext {

    myProperty = findProperty('myProperty') ?: 'Hello, world!'

}

println "My property value: ${project.ext.myProperty}"

//或者

println "My property value: ${myProperty}"

在 Gradle 中,ext 是一个特殊的命名空间,一旦在其中定义了一个额外属性,就可以在拥有它的对象(在下面的例子中分别是Project、Task和子项目)上直接读取和更新它。 

我们有两种方式用于添加项目属性,按照优先级从高到低排序。

1.命令行: 通过-P命令行选项添加属性到Project对象。

$ ./gradlew build -PmyProperty='Hi, world'

2.系统属性或环境变量: 使用特殊命名约定的系统属性或环境变量设置项目属性。 

$ ./gradlew build -Dorg.gradle.project.myProperty='Hi, world'

如果某个系统属性名称看起来像org.gradle.project.prop=someValue,Gradle 就会自动将 prop 作为一个属性添加到你的Project对象上,并赋值为 someValue 。

Gradle也支持将环境变量作为属性添加到Project对象上,只是有不同的命名约定,看起来像 ORG_GRADLE_PROJECT_prop=someValue。

下面的例子演示了如何设置Project对象上的foo属性的值为bar:

使用命令行行选项

$ ./gradlew build -Pfoo=bar

$ ./gradlew build -Dorg.gradle.project.foo=bar

 在gradle.properties文件中设置系统属性

org.gradle.project.foo=bar

使用环境变量 

export ORG_GRADLE_PROJECT_foo=bar 

当您没有持续集成服务器的管理权限并且需要设置不容易看到的属性值时,这个功能非常有用。由于在该场景中不能使用-P选项,也不能更改系统级配置文件,因此正确的策略是更改持续集成构建作业的配置,添加与预期模式匹配的环境变量设置。这对系统上的普通用户来说是不可见的。

在构建脚本中可以通过直接使用名称来访问项目属性,就像使用变量一样。

命令行接口(Command-Line Interface)

在之前的学习中介绍了相关知识,有兴趣可以去看看。 大部分的命令行标志可以在gradle.properties文件中指定,所以命令行标志并不是必须的。

系统属性(System properties)

系统属性是那些设置在JVM级别的,被Gradle构建进程使用的变量,可以在build.gradle构建脚本中通过System类使用它们。

有两种方式添加系统属性,按优先级高低排序:

1.命令行:使用-D命令行选项,传递一个系统属性给执行Gradle构建的JVM。在Gradle中,-D选项和Java命令中的-D选项有相同的效果。

$ ./gradlew build -Dgradle.wrapperUser=myuser

2.gradle.properties文件:在该文件中可以使用[systemProp.]前缀来设置系统属性:

systemProp.gradle.wrapperUser=myuser

systemProp.gradle.wrapperPassword=mypassword

下面这些是几个常见的系统属性:

gradle.wrapperUser=(myuser)

指定用于从服务器下载 Gradle 发行版的用户名,当服务器使用了 HTTP 基本认证。

gradle.wrapperPassword=(mypassword)

指定用于从服务器下载 Gradle 发行版的密码,当服务器使用了 HTTP 基本认证。

gradle.user.home=(path to directory)

指定GRADLE_USER_HOME目录,如果未设置默认是USER_HOME/.gradle

https.protocols

指定支持的 TLS 协议版本,用逗号分隔。这通常用于限制或指定 Gradle 在进行 HTTPS 请求时应使用的 TLS 版本,比如https.protocols=TLSv1.2,TLSv1.3

在一个多项目构建中,在除了根项目的任何项目里设置的systemProp属性都会被忽略。只有根项目的gradle.properties文件会进行systemProp前缀的属性检查和处理。需要注意的是,GRADLE_USER_HOME目录下的全局配置文件gradle.properties也会定义系统属性,并且优先级更高,会优先使用。

下面的例子演示了如何使用系统属性:

例子1:使用gradle.properties文件设置系统属性:

// gradle.properties

systemProp.system=gradlePropertiesValue

例子2:在配置阶段读取系统属性:

// init.gradle

// Using the Java API

println System.getProperty('system')

//settings.gradle

// Using the Java API

println System.getProperty('system')

// Using the Gradle API, provides a lazy Provider<String>

println providers.systemProperty('system').get()

//build.gradle

// Using the Java API

println System.getProperty('system')

// Using the Gradle API, provides a lazy Provider<String>

println providers.systemProperty('system').get()

例子3:在执行阶段读取系统属性:

//build.gradle

tasks.register('printProperty', PrintValue) {

    // Using the Gradle API, provides a lazy Provider<String> wired to a task input

    inputValue = providers.systemProperty('system')

}

例子4:通过命令行-D设置系统属性system:

$ ./gradlew -Dsystem=commandLineValue

Gradle属性(Gradle properties)

Gradle提供了多种选项使得我们可以更容易地配置执行构建的Java进程,尽管可以通过GRADLE_OPTS 或 JAVA_OPTS在本地环境中配置这些值,但将某些设置(如JVM内存配置和JAVA_HOME位置)存储在版本控制中,以确保整个团队都能使用一致的环境,这是非常有用的。

比如在gradle.properties文件中添加这些设置:

org.gradle.caching.debug=false

Gradle 在处理配置时,会综合考虑通过命令行设置的 Gradle 属性和 gradle.properties 文件中的设置。当同一个选项在多个位置被配置时,Gradle 会按照下面的优先级顺序来确定哪个配置会被采用,并且第一个被找到的配置会“获胜”。

Priority

Method

Location

Details

1

Command line interface

.

在命令行中使用-D设置

2

gradle.properties file

GRADLE_USER_HOME

 GRADLE_USER_HOME目录下gradle.properties文件中存储的设置

3

gradle.properties file

Project Root Dir

一个项目目录下gradle.properties文件中存储的设置,然后是父项目目录,一直到项目的根目录下的gradle.properties文件中的设置

注意这里本身也有一个优先级从高到低的顺序

4

gradle.properties file

GRADLE_HOME

 GRADLE_HOME目录下gradle.properties文件中存储的设置, GRADLE_HOME是一个可选的用来指定Gradle安装目录的环境变量,只有正确设置了才有效。

 注意:GRADLE USER HOME的位置可能已经事先通过-Dgradle.user.home修改了。

下面这些是常见的Gradle属性:

org.gradle.caching=(true,false)

当设置为true,启用构建缓存,Gradle检测到任务的输出已经在构建缓存中时,会直接从缓存中加载。

默认是false

org.gradle.caching.debug=(true,false)

当设置为true,启用构建缓存的调试日志,Gradle 会在控制台记录每个任务的输入属性哈希值和构建缓存键。

默认是false

org.gradle.configuration-cache

启用配置缓存, Gradle会尝试重用之前构建的配置,从而加快配置阶段的速度。

默认是false

org.gradle.configureondemand=(true,false)

当设置为true,启用按需配置功能,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 守护进程在空闲状态下等待多少毫秒后自动终止。

默认是3小时。

org.gradle.debug=(true,false)

当设置为true,启用远程调试,Gradle 会在端口 5005 上启动一个调试服务器,并等待调试器连接。注意,这会导致 JVM 暂停,直到调试器连接为止。

默认是false

org.gradle.java.home=(path to JDK home)

指定Gradle构建过程使用的Java主目录。设置为JDK或JRE的位置,但使用JDK更安全。

默认值从环境变量(如JAVA_HOME)或java命令的路径中派生。

org.gradle.jvmargs=(JVM arguments)

为Gradle守护进程指定JVM参数。特别有用于配置JVM内存设置以优化构建性能。

默认值是-Xmx512m "-XX:MaxMetaspaceSize=384m"。

org.gradle.logging.level=(quiet,warn,lifecycle,info,debug)

当设置为quiet、warn、 info,、或 debug时,Gradle会使用设置的日志级别。

默认是lifecycle级别。

org.gradle.priority=(low,normal)

指定Gradle守护进程及其启动的所有进程的调度优先级。

默认值是normal。

org.gradle.warning.mode=(all,fail,summary,none)

设置Gradle如何处理警告信息。

默认是summary

下面的例子演示了如何使用Gradle属性。

例子1:在gradle.properties文件中设置Gradle属性:

gradlePropertiesProp=gradlePropertiesValue

gradleProperties.with.dots=gradlePropertiesDottedValue

例子2:在配置阶段读取系统属性:

//settings.gradle

// 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']

//

//build.gradle

// 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']

也可以像使用项目额外属性一样,比如ext["gradlePropertiesProp"]。

注意,如果Gradle属性的名称中有一个点,那么使用动态Groovy名称是不可能的,必须使用API或动态数组表示法。

例子3:在执行阶段读Gradle属性:

tasks.register('printProperty', PrintValue) {

    // Using the API, provides a lazy Provider<String> wired to a task input

    inputValue = providers.gradleProperty('gradlePropertiesProp')

}

在子项目目录下的gradle.properties文件中申明的属性,只对当前项目或其子项目可用。

环境变量(Environment variables) 

Gradle提供了一些环境变量,如下面列出来的这些,你可以在构建脚本中使用System.getenv()方法来访问。

GRADLE_HOME

Gradle安装目录,可以用来指定一个本地的Gradle版本,而不使用wrapper

JAVA_OPTS

通常用于传递JVM选项和自定义设置给JVM,例如,JAVA_OPTS="-server -Xms2048m -Xmx2048m -Xss512k"表示设置服务器模式,初始和最大堆内存各为2048MB,以及线程栈大小为512KB。

然而并非所有的 Java 应用程序都会考虑 JAVA_OPTS。这取决于应用程序的启动脚本是否设计为读取并使用这个环境变量。

GRADLE_OPTS

用于指定启动 Gradle 客户端 VM 时要使用的 JVM 参数,这里的“客户端 VM”指的是处理命令行输入/输出的 Gradle 进程,而不是实际执行构建的进程。因此,这个环境变量主要用于调整 Gradle 命令行客户端的性能和行为。实际的构建任务是由 Gradle 守护进程(Gradle Daemon)执行的,而这个环境变量并不影响守护进程的配置。

GRADLE_USER_HOME

指定了 Gradle 用来存储其全局配置属性、初始化脚本、缓存、日志文件等的目录。

如果没有设置,默认是USER_HOME/.gradle。

JAVA_HOME

指定 JDK(Java 开发工具包)的安装目录,这个环境变量对于许多 Java 相关的工具和应用程序来说都是必要的,因为它们需要知道在哪里可以找到 Java 运行时环境和编译工具。

对于 Gradle 来说,JAVA_HOME 指定的 JDK 会被用于 Gradle 客户端 VM。此外,如果没有在 Gradle 属性文件中通过 org.gradle.java.home 指定其他的 JDK 路径,那么这个 JDK 也会被 Gradle 守护进程使用。

下面的例子演示了如何使用环境变量。

例子1:在配置阶段读取环境变量:

//init.gradle

// Using the Java API

println System.getenv('ENVIRONMENTAL')

//

//settings.gradle

// Using the Java API

println System.getenv('ENVIRONMENTAL')

// Using the Gradle API, provides a lazy Provider<String>

println providers.environmentVariable('ENVIRONMENTAL').get()

//

//build.gradle

// Using the Java API

println System.getenv('ENVIRONMENTAL')

// Using the Gradle API, provides a lazy Provider<String>

println providers.environmentVariable('ENVIRONMENTAL').get()

例子2:在执行阶段读取环境变量:

//build.gradle

tasks.register('printValue', PrintValue) {

    // Using the Gradle API, provides a lazy Provider<String> wired to a task input

    inputValue = providers.environmentVariable('ENVIRONMENTAL')

}

  • 14
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值