Gradle系列相关文章:
1、Gradle理论与实践一:Gradle入门
2、Gradle理论与实践二:Groovy介绍
3、Gradle理论与实践三:Gradle构建脚本基础
4、Gradle理论与实践四:自定义Gradle插件
5、Gradle配置subprojects和allprojects的区别:subprojects和allprojects的区别
subprojects 和 allprojects 的区别,先给出结论: allprojects是对所有project的配置,包括Root Project;而subprojects是对所有Child Project的配置。
举个例子:
新建一个test_gradle
的文件夹,在文件夹里新建build.gradle
和settings.gradle
文件,另外再新建两个文件夹,名字分别为app
lib
,如下图所示:
在settings.gradle
中写入:
include ':app',':lib'
在build.gradle
中写入:
allprojects {
tasks.create('hello') {
doLast {
task ->
print "project name is $task.project.name \n"
}
}
}
测试一下allprojects
的范围,打开控制台,并切换到新建的根目录,执行gradle -q hello
命令,执行结果:
bogon:test_gradle mq$ gradle -q hello
project name is test_gradle
project name is app
project name is lib
再来测试下subprojects
的作用域,打开build.gradle
继续写入:
allprojects {
tasks.create('hello') {
doLast {
task ->
print "project name is $task.project.name \n"
}
}
}
subprojects {
hello << {
print "here is subprojects \n"
}
}
可以看到我们在下面新加了subprojects
,并通过之前建的task
任务hello
输出了一段字符串,继续执行命令gradle -q hello
,执行结果:
bogon:test_gradle mq$ gradle -q hello
project name is test_gradle
project name is app
here is subprojects
project name is lib
here is subprojects
可以看到只有只有根目录下面没有subprojects
中task
的输出,这也印证了我们上面的结论:allprojects是对所有project的配置,包括Root Project;而subprojects是对所有Child Project的配置。
进入Child Project
目录下,新建一个build.gradle
文件,写入:
hello.doLast {
print " —— I'm the app project \n"
}
继续执行命令gradle -q hello
,执行结果:
bogon:test_gradle mq$ gradle -q hello
project name is test_gradle
project name is app
here is subprojects
—— I'm the app project
project name is lib
here is subprojects
可以看到task(hello)
遍历顺序是:allprojects > subprojects > Child Project
扩展
在rootProject
下的build.gradle
中,buildscript的repositories和allprojects的repositories有什么区别?如下:
//build.gradle
buildscript {
repositories {
jcenter()
google()
maven {
url 'https://maven.google.com/'
name 'Google'
}
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
}
}
allprojects {
repositories {
jcenter()
google()
maven {
url "http://maven.xxxxxxxx/xxxxx"
}
}
}
buildscript
里是gradle
脚本执行所需依赖,如上所示对应的是maven
库和插件allprojects
里是项目本身需要的依赖,比如代码中某个类是打包到maven
私有库中的,那么在allprojects—>repositories
中需要配置maven
私有库,而不是buildscript
中,不然找不到。