我们知道build.gradle是子项目的编译脚本,一个script,也是我们最关心的内容,来看看长什么样:
plugins { // Apply the application plugin to add support for building a CLI application in Java. id 'application' } repositories { // Use Maven Central for resolving dependencies. mavenCentral() } dependencies { // Use JUnit test framework. testImplementation 'junit:junit:4.13.2' // This dependency is used by the application. implementation 'com.google.guava:guava:30.1.1-jre' } application { // Define the main class for the application. mainClass = 'mypackage.App' }
Gradle中的各种配置,都采用script脚本,我们先了解下script基本信息
script和instance
Gradle中一共有三种Script。分别对应不同的instance
Type of script | Delegates to instance of | 存在形式 |
---|---|---|
Build script | Project | 项目中的build.gradle文件 |
Init script | Gradle | 1. Gradle启动时通过命令行参数-I or –init-script,指定的script脚本 2. USER_HOME/.gradle/init.gradle文件 3. USER_HOME/.gradle/init.d/*.gradle文件 4. GRADLE_HOME/init.d/*.gradle文件 |
Settings script | Settings | 项目中的settings.gradle文件 |
所谓instance,是Gradle内部工作的一个实例。当我们在配置script的时候,其实是在配置该Instance的属性。Gradle会利用Instance来执行实际的工作。
比如说我们配置Build Script,也就是上面的build.gradle,那么Gradle在启动的时候,就会根据我们的配置,创建一个Project instance。然后运行instance执行build工作
如果想了解具体某个script可以配置什么内容,就得去看对应Instance的属性值。
script和代码
可能你都没意识到,在你配置脚本的时候,你其实是在写代码
Gradle中script的编写语言,是一种正儿八经的编程语言,叫做Groovy,另一种可用的语言,是Kotlin。你可以这样写的:
tasks.register('upper') { doLast { String someString = 'mY_nAmE' println "Original: $someString" println "Upper case: ${someString.toUpperCase()}" } }
示例中出现了变量,赋值,以及函数调用,你必须得相信他们是真正的代码,而不是一般的配置。
所有的script,都必须实现Script
接口,也就说,你写script的时候,其实在写一个实现类
Script中的语句,常规的很好理解:
String someString = 'mY_nAmE' println "Original: $someString" println "Upper case: ${someString.toUpperCase()}"
比较怪异点的是叫做script block的东西,也就是大括号包围起来这个:
tasks.register('upper') { }
一个script block其实就是一个函数,大括号里面的一大坨东西,是函数要执行的指令,是一个闭包形式。如果你不懂闭包,就直接理解为这些指令被打包在一起,作为参数传递给函数,函数调用时会执行这些指令
这里调用了tasks.register函数:
tasks.register('upper') { 闭包参数 }
回到我们的例子:
tasks.register('upper') { doLast { String someString = 'mY_nAmE' println "Original: $someString" println "Upper case: ${someString.toUpperCase()}" } }
翻译一下就是:
- 调用tasks.register函数
- task.register运行时,调用doLast函数
- doLast运行时,执行对应三条指令
script总结
当你在写一个script的时候,你正儿八经的在写代码,其实在写一个类,这个类实现了Script
接口,写这个类的目的,是为了配置对应instance的属性
回复 can i purchase cheap cytotec prices 取消回复