为何注释buildscript中repositories仍可正常构建Android应用?
嘿,我来帮你把这个点掰明白~
首先得搞清楚buildscript块的核心定位:它是专门用来配置Gradle构建脚本自身所需依赖的,和allprojects里的repositories完全是两个独立的作用域——allprojects的仓库是给你的App模块、库模块里的业务依赖(比如OkHttp、Glide这些)找资源用的,而buildscript的仓库是给构建工具自己找依赖的(比如Android Gradle插件、各种Gradle插件)。
为什么你注释了buildscript的repositories还能构建?
原因很简单:你用的com.android.tools.build:gradle:3.0.1这个Android Gradle插件,已经存在于你的本地Gradle缓存里了,或者你的全局Gradle配置(比如~/.gradle/gradle.properties或者init.gradle文件)里已经配置了默认的仓库源,所以即使你注释了项目里的buildscript仓库,Gradle依然能从缓存或全局配置里找到这个插件,自然能正常构建。
但这只是“侥幸”哦,要是哪天你清了本地缓存、换了新电脑,或者升级了插件版本,没有buildscript的仓库声明,Gradle就会直接报错找不到依赖了。
什么时候必须用buildscript的repositories?
当你需要在buildscript.dependencies里引入新的、本地没有缓存的构建工具依赖时,就必须在buildscript块里声明对应的仓库。举两个典型例子:
例子1:引入第三方Gradle插件
比如你要集成Firebase,需要用到Google Services插件,这时候这个插件是给构建脚本用的,必须在buildscript里配置仓库和依赖:
buildscript { // 必须在这里声明google仓库,因为google-services插件存放在Google的Maven仓库里 repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.0.1' // 这个插件依赖必须从buildscript的仓库拉取 classpath 'com.google.gms:google-services:4.3.15' } } // 之后在app模块的build.gradle里应用这个插件 // apply plugin: 'com.google.gms.google-services'
如果这时候你注释了buildscript的repositories,Gradle就找不到com.google.gms:google-services这个依赖,直接构建失败。
例子2:引入内部私服的自定义插件
假设你的公司有自己的Maven私服,上面放了内部开发的Gradle插件(比如统一打包、代码检查的插件),要使用这个插件的话,必须在buildscript里配置私服仓库地址:
buildscript { repositories { maven { url 'http://your-company-maven-repo.com/repository' credentials { username 'your-username' password 'your-password' } } google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.0.1' // 内部插件依赖,必须从私服拉取 classpath 'com.yourcompany:custom-build-plugin:1.0.0' } }
没有这个私服仓库声明,Gradle根本不知道去哪里找这个自定义插件。
最后提醒
建议你把原来buildscript里的repositories恢复回来,毕竟com.android.tools.build:gradle这类核心构建插件,本身就是需要从Google或jcenter仓库拉取的,保留仓库声明能避免后续环境变化带来的构建问题。
内容的提问来源于stack exchange,提问作者Hong

