美文网首页Android-gradleGradle安卓
Gradle配置中subprojects 和 allprojec

Gradle配置中subprojects 和 allprojec

作者: 饱醉豚我去年买了个表 | 来源:发表于2018-12-28 14:26 被阅读2次

    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,如下图所示:
    image.png

    在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"
            }
        }
    }
    

    1、 buildscript里是gradle脚本执行所需依赖,分别是对应的maven库和插件
    2、 allprojects里是项目本身需要的依赖,比如代码中某个类是打包到maven私有库中的,那么在allprojects—>repositories中需要配置maven私有库,而不是buildscript中,不然找不到。

    相关文章

      网友评论

        本文标题:Gradle配置中subprojects 和 allprojec

        本文链接:https://www.haomeiwen.com/subject/rvwslqtx.html