Gradle构建脚本能否追加配置?导入外部脚本后添加插件是否会覆盖配置?
当然可以在主构建脚本里添加新插件啦!咱们来详细拆解你的两个疑问:
1. 主脚本中添加新插件完全可行
通过apply from: "../init.gradle"导入的初始化脚本,会在主脚本执行之前完成配置加载,但这并不影响主脚本后续添加新插件。你有两种常见的方式可以实现:
- 方式一:使用
plugins块(Gradle 3.0+推荐):直接在主脚本中声明新插件,比如:plugins { id 'java' id 'com.github.johnrengelman.shadow' version '7.1.2' } - 方式二:扩展
buildscript闭包后应用插件:如果插件不在Gradle插件门户,你可以先在主脚本的buildscript里添加依赖仓库和插件classpath,再应用插件,比如:buildscript { repositories { gradlePluginPortal() } dependencies { classpath 'com.some.custom:plugin:1.0.0' } } apply plugin: 'com.some.custom'
2. 主脚本的buildscript闭包不会覆盖初始化脚本的配置
Gradle对buildscript闭包的处理逻辑是累加合并,而不是覆盖:
- 仓库(
repositories):初始化脚本中定义的仓库会和主脚本里的仓库合并,最终构建脚本可以使用所有配置的仓库拉取依赖。 - 依赖(
dependencies):两边声明的classpath依赖都会被包含进来。如果出现同一个依赖的不同版本,Gradle会按照依赖解析规则(默认优先使用最新版本)来选择最终版本,不过建议尽量保持版本一致避免潜在冲突。
举个直观的例子:
假设init.gradle内容如下:
buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:7.0.0' } }
主脚本中的buildscript配置:
apply from: "../init.gradle" buildscript { repositories { gradlePluginPortal() // 新增仓库 } dependencies { classpath 'com.github.johnrengelman.shadow:shadow-gradle-plugin:7.1.2' // 新增依赖 classpath 'com.android.tools.build:gradle:7.2.0' // 同依赖不同版本 } }
最终生效的buildscript会包含mavenCentral()和gradlePluginPortal()两个仓库,classpath则会包含shadow-gradle-plugin:7.1.2以及gradle:7.2.0(因为版本更新)。
内容的提问来源于stack exchange,提问作者Kyrylo Liubun
相关产品推荐
相关产品推荐

