美文网首页Gradle构建
Gradle-优化脚本【小坑记录】

Gradle-优化脚本【小坑记录】

作者: 未见哥哥 | 来源:发表于2020-03-21 18:01 被阅读0次

1、前言

你是不是想过在根目录/build.gradle 根据一个变量来确定是否依赖某一个 classpath 阿?

举个我们项目中的栗子:因为我们的项目是国内外同一套代码,国外的会依赖谷歌相关的服务,而国内的不依赖谷歌服务。所以我想在 build.gradle 根据需要去依赖谷歌服务。

classpath 'com.google.gms:google-services:4.2.0'

2、出现问题

在 config.gradle 声明一个 channle 变量

//这里是 config.gradle
ext {
    channel = 1//我们在这里定义一个变量channel,假设1表示海外市场的包
}

在根build.gradle 中依赖 config.gradle 然后根据 ext.channel 这个值来决定是否要依赖谷歌服务。

//这里是根目录下的build.gradle
apply from 'config.gradle'
buildscript {
  
    dependencies {
        ...
        if(project.ext.channel == 1){//判断是否要依赖谷歌服务
                classpath 'com.google.gms:google-services:4.2.0'
        }
    }
}

上面这样的代码,我们是最容易想到的解决方案,但是当你运行起来的时却发现一个奇怪的事情,你会看到下面的错误日志

> Cannot get property 'channel' on extra properties extension as it does not exist

我们显然是已经在 config.gradle 中定义了 channel 这个变量了,但是为什么还是找不到呢?

3、探索1:监听根build.gradle配置完毕获取 channel 字段

apply from 'config.gradle'
project.afterEvaluate {
    println "root project is afterEvaluate"
    println "the channel is ${project.ext.channel}"
}
buildscript {
    
    dependencies {
        ...
        println "config google-services"
        classpath 'com.google.gms:google-services:4.2.0'
        
    }
}

可以看到日志, 在 afterEvaluate 中是可以拿到这个 channel 值的,那就可以排除我们ext写错的情况了。

那就有点奇怪了,进一步猜想,难道是因为执行顺序问题?

4、探索2:log验证执行顺序

apply from 'config.gradle'
println "apply from config.gradle"//输出1
project.afterEvaluate {
  println "afterEvaluate the channel is ${project.ext.channel}"//输出2
}
buildscript {
    
    dependencies {
        ...
        println "config google-services"//输出3
        classpath 'com.google.gms:google-services:4.2.0'
        
    }
}

这时可以发现,执行的顺序分别是 输出3 -> 输出1 -> 输出2

哦嚯,果然是执行顺序的问题,这个有点坑了,对比 子build.gradle 都是按顺序从上往下执行了,在 根build.gradle 就有点不一样了,其实想想也有道理,因为这里会依赖一些 gradle 插件之类的,如果让其它的 gradle 先执行那就肯定有问题了。

5、解决方案

将 apply 相关的代码挪到 buildscript 这个闭包内就可以啦,代码如下所示

buildscript {
    //将对应的外部依赖放到这里去依赖
    apply from 'config.gradle'
    dependencies {
        ...
        if(project.ext.channel ==1){
            classpath 'com.google.gms:google-services:4.2.0'
        }
        
    }
}

本文是笔者学习之后的总结,方便日后查看学习,有任何不对的地方请指正。

记录于 2020年3月21号

相关文章

  • Gradle-优化脚本【小坑记录】

    1、前言 你是不是想过在根目录/build.gradle 根据一个变量来确定是否依赖某一个 classpath 阿...

  • Gradle-构建脚本

    Gradle 构建配置脚本常识科普 构建语言 Gradle提供了一种领域特定语言,目前同时支持 Groovy 和 ...

  • Gradle-踩坑

    在安卓开发中肯定会使用到第三方库,gradle提供了一种快捷的依赖方式,但在开发中遇到了下面这种情况我们要怎么解决...

  • shell 当前工作目录的绝对路径

    @(Linux 命令脚本) 编写脚本中,需要获取执行脚本的绝对路径,今天写脚本的时候不小心踩了个坑,记录下。 那个...

  • Android开发--Gradle-脚本-(二)

    一、Gradle脚本 当我们创建一个新的工程,Android studio会默认为我们创建三个gradle文件,两...

  • H5移动端的性能优化

    一、渲染优化 二、css优化 三、加载优化 四、脚本执行优化

  • shell自动格式化分区并挂载

    优化后的脚本

  • 小坑记录

    这里简单记录一下小坑,都是在开发过程中遇到的小问题,有的以后可能会写一些长篇来具体讨论一下,有的只是为了提醒自己不...

  • 自用几个浏览器脚本推荐

    自用浏览器脚本 积累了一段时间的自用脚本, 记录一下. 1. AC-baidu 各大搜索结果页优化, 可将结果多栏...

  • Centos 7系统优化脚本

    脚本如下,后续继续优化

网友评论

    本文标题:Gradle-优化脚本【小坑记录】

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