Gradle之恋(8)-构建环境配置

为了使团队能够具有统一的构建环境如JVM的内存、Java home、daemon的开关等配置,Gralde提供了多种接口方式,如配置文件、环境变、命令行量等。实践中最好把配置放在版本控制中,方便团队共用。
Gradle

Gralde属性和系统属性

为了后续演示的顺利,我们先来看看Gradle的属性变量。

-D方式

我们都知道-D是给JVM传递参数的,使用Gradle通过-D也可以传递参数给JVM,但通过-Dorg.gradle.project.prop=somevalue可以传值给Gradle,如build.gradle

task showProp{
doLast{
if(project.hasProperty('myName')){
println myName
}
}
}

执行

$ gradle -q showProp -Dorg.gradle.project.myName=zhaiqianfeng
zhaiqianfeng

-P方式

也可以通过Gradle特有的参数-P来传值,格式如-Pprop=somevalue,如使用上面的build.gralde,执行

$ gradle -q showProp -PmyName=zqf
zqf

环境变量方式

通过环境变量也可以传值给Gradle,格式如 ORG_GRADLE_PROJECT_prop=somevalue,再次利用上面的build.gradle,设置环境变量:

export ORG_GRADLE_PROJECT_myName=somevalue

执行

$ gradle -q showProp
somevalue

配置文件方式

也可以通过配置文件:gradle.properties来传值,Gradle搜索该文件的顺序如下:现在项目的构建目录查找,如果没有则去Gradle的user home目录查找。再次利用上面的build.gradle,在项目的根目录中新建配置文件gradle.properties,内容:

myName=zqf

如上面执行命令即可验证。

配置文件还可以设置系统参数,系统参数是以“systemProp.”为前缀,格式systemProp.prop=somevalue,通过System.properties[‘prop’]来获取。系统参数所在的gradle.properties必须在根目录才能获取,如在多项目的任何子项目中都会被忽略

// build.gradle
task showProp{
doLast{
println System.properties['myName']
}
}

// gradle.properties
systemProp.myName=zqf

执行

$ gradle -q showProp
zqf

环境配置

配置文件方式

通过gradle.properties配置文件配置环境的字段有:

  • org.gradle.daemon - 设置daemon的开关,一般我们总是设置为true来打开daemon来提高构建速度,而在CI(持续集成)构建这样的长时间花费的动作,则关闭daemon来提高一致性和可靠性;实际上在Gradle3.0后默认是开启daemon的;
  • org.gradle.java.home - 指定gradle使用的jre或jdk;
  • org.gradle.jvmargs - 设置JVM参数,典型的场景就是内存的设置;
  • org.gradle.configureondemand - 孵化模式,可以在配置项目时使得Gradle具有选择性。只适用于相关的项目被配置为在大型多项目中更快地构建;
  • org.gradle.parallel - 孵化模式,并行构建;
  • org.gradle.workers.max - 孵化模式,设置最大的进程数;
  • org.gradle.debug - 设置为true,即开启调试模式,监听5005端口,直到有一个debugger附加上它,它等同于设置JVM的“-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005”;
  • org.gradle.daemon.performance.enable-monitoring - 如果设置为false,则关闭对daemon的内存监控;
守护进程Daemon

Gradle运行于JVM,在一个构建序列中每次都需要启动一个JVM进程,因此启动过程耗时比较大。为了解决这个问题,Gradle启动一个后台长期存活的守护进程来执行构建,来避免昂贵的启动过程。
Gradle的守护进程不仅能够避免JVM启动的花费,还能在内存中缓存如项目结构、文件、任务等,这样能更好地提高构建性能。你可以使用–profile命令好参数来对比启动/关闭守护进程的话费。更多命令行参数请参考这里
对于上面所述的环境参数同样,如果不适用Daemon则每次启动JVM都会解析gradle.properties来设置,而使用daemon就能避免这种尴尬的情况。

环境变量方式

可以通过

export GRADLE_OPTS="-Dorg.gradle.daemon=true"

当然你也可以通过JAVA_OPTS来设置JVM的内存、http代理等。

命令行参数方式

当然也可以通过-D方式来配置JVM的内存和代理,这里不再累述。

典型应用场景

某些场合可能无法直接连接公网,需要设置JVM的http或https,那么gradle.properties可以设置为:

//http
systemProp.http.proxyHost=www.somehost.org
systemProp.http.proxyPort=8080
systemProp.http.proxyUser=userid
systemProp.http.proxyPassword=password
systemProp.http.nonProxyHosts=*.nonproxyrepos.com|localhost


//https
systemProp.https.proxyHost=www.somehost.org
systemProp.https.proxyPort=8080
systemProp.https.proxyUser=userid
systemProp.https.proxyPassword=password
systemProp.https.nonProxyHosts=*.nonproxyrepos.com|localhost

总结

配置构建环境,由于环境变量JAVA_OPTS可能会带来改变了不期望改变的应用行为的副作用,命令行的繁琐和不统一,因此配置文件是首选也是推荐的配置方式。

翟前锋 wechat
欢迎订阅我的微信公众号:zhaiqianfeng!