Gradle中depends与dependencies关键字的区别解析
在Gradle中
depends与dependencies的区别 嘿,这个问题问得很到位!咱们结合你给出的代码场景,把两者的核心差异拆解清楚:
1. dependencies:Gradle原生的核心依赖配置块
这是Gradle官方提供的标准语法,所有Gradle项目默认都支持,是你声明项目依赖的唯一官方入口。
它的作用是定义项目在不同构建阶段(编译、测试运行、打包等)需要的依赖项,不管是内部子项目依赖(比如你代码里的compile project(':asm-test')),还是外部第三方库依赖(比如testImplementation 'org.junit.jupiter:junit-jupiter-api:5.1.0'),都必须放在这个块里才能被Gradle识别并处理。
比如你第二个场景的代码:
dependencies { requires.each { projectName -> compile project(projectName) } depends.each { artifactName -> compile artifactName } testImplementation 'org.junit.jupiter:junit-jupiter-api:5.1.0', 'org.junit.jupiter:junit-jupiter-params:5.1.0' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.1.0' testCompile project(':asm-test') }
这里的dependencies块就是用来把各种依赖(包括遍历自定义属性拿到的依赖)真正注册到Gradle的依赖管理系统中。
2. depends:项目自定义的属性,非Gradle原生关键字
这个词不是Gradle的内置语法,它是你当前项目团队自定义的一个属性,本质上就是用来存储依赖坐标的一个容器。
看你第一个场景的代码:
project(':tools:bnd-module-plugin') { description = "bnd plugin to build moduleinfo with ${rootProject.description}" sourceSets.main.java.srcDirs += project(':asm').sourceSets.main.java.srcDirs depends = ['biz.aQute.bnd:biz.aQute.bnd:3.4.0'] }
这里是给tools:bnd-module-plugin这个子项目设置了一个名为depends的列表属性,把外部库坐标存进去而已。它本身不会让依赖生效,必须在dependencies块里通过逻辑(比如你代码里的depends.each { artifactName -> compile artifactName })把这些坐标转化为Gradle能识别的依赖配置,才会真正起作用。
总结
dependencies:Gradle官方规定的依赖声明核心块,是依赖生效的必要环节,属于Gradle原生语法。depends:项目自定义的辅助属性,仅用来存储依赖信息,本身不具备依赖管理的能力,必须配合dependencies块的逻辑才能让依赖生效。
内容的提问来源于stack exchange,提问作者saga
相关产品推荐
相关产品推荐

