gradle - Gradle 配置依赖和 Gradle 配置传入依赖有什么区别?

标签 gradle

Gradle 配置有两个属性,称为 dependenciesincoming .根据我的理解,我们可以通过 Gradle 依赖 block 向配置添加依赖,如下所示:

dependencies {
    testCompile "junit:junit:4.12"
}

我希望在执行上述代码块后,testCompile.dependencies 将返回一个集合,其中至少包含 1 个表示 JUnit 依赖项的对象。

不过,我不确定 testCompile.incoming 将代表什么。

配置的dependenciesincoming 属性之间有什么关系?使用传入属性的示例是什么?

最佳答案

我想我通过一些实验弄明白了。我首先使用 Gradle 创建了一个虚拟项目。我有以下 Gradle 脚本来尝试 testCompile 配置属性的不同属性。

group 'com.example'
version '1.0-SNAPSHOT'

apply plugin: 'java'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

task("dummyFileGenerator") {
    outputs.file '/tmp'
}

// configurations.testCompile.transitive false

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    testCompile files('/tmp')

}

println "Printing dependencies"
configurations.testCompile.dependencies.all {
    println(it)
}
println "======="

println "Printing all dependencies"
configurations.testCompile.allDependencies.all {
    println it
}
println '======='

println "printing incoming dependencies"
configurations.testCompile.incoming.dependencies.all {
    println(it)
}
println "======="

println "printing files of incoming dependencies"
configurations.testCompile.incoming.files.forEach {
    println it
}
println "======="

println "printing artifacts of incoming dependencies"
configurations.testCompile.incoming.artifacts.forEach {
    println it
}
println "======="

println "printing files of incoming dependencies (again)"
configurations.testCompile.incoming.files.forEach {
    println it
}
println "======="

task("blecgh") {
    doLast {
        println "Hello!"
    }
}

此脚本的示例输出是:

Printing dependencies
DefaultExternalModuleDependency{group='junit', name='junit', version='4.12', configuration='default'}
org.gradle.api.internal.artifacts.dependencies.DefaultSelfResolvingDependency_Decorated@433edba9
=======
Printing all dependencies
DefaultExternalModuleDependency{group='junit', name='junit', version='4.12', configuration='default'}
org.gradle.api.internal.artifacts.dependencies.DefaultSelfResolvingDependency_Decorated@433edba9
=======
printing incoming dependencies
DefaultExternalModuleDependency{group='junit', name='junit', version='4.12', configuration='default'}
org.gradle.api.internal.artifacts.dependencies.DefaultSelfResolvingDependency_Decorated@433edba9
=======
printing files of incoming dependencies
/tmp
/usr/local/google/home/afwang/.gradle/caches/modules-2/files-2.1/junit/junit/4.12/2973d150c0dc1fefe998f834810d68f278ea58ec/junit-4.12.jar
/usr/local/google/home/afwang/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-core/1.3/42a25dc3219429f0e5d060061f71acb49bf010a0/hamcrest-core-1.3.jar
=======
printing artifacts of incoming dependencies
tmp
junit.jar (junit:junit:4.12)
hamcrest-core.jar (org.hamcrest:hamcrest-core:1.3)
=======
printing files of incoming dependencies (again)
/tmp
/usr/local/google/home/afwang/.gradle/caches/modules-2/files-2.1/junit/junit/4.12/2973d150c0dc1fefe998f834810d68f278ea58ec/junit-4.12.jar
/usr/local/google/home/afwang/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-core/1.3/42a25dc3219429f0e5d060061f71acb49bf010a0/hamcrest-core-1.3.jar
=======
:blecgh
Hello!

BUILD SUCCESSFUL

Total time: 0.621 secs

需要注意的有趣位是 incoming.filesincoming.artifacts 包含 Hamcrest 依赖项的表示。这表明配置的 incoming 属性除了配置的直接依赖项的工件之外还包括配置的传递依赖项的工件。这似乎与配置的 transitive 属性有关。如果 transitive 属性设置为 false,则 incoming 属性将不包含配置的传递依赖项的工件;仅包含直接依赖项的工件。

请注意,配置的 allDependencies 属性不包括传递依赖项。相反,allDependencies 属性包括从 super 配置继承的依赖项。

这是一张图表,可以帮助解释我认为这些配置属性代表的含义:

configParent -- depParent
|
|
configChild -- depA
            \- depB -- depB1 -- depB2

configParentconfigChild 是配置。 configParent 直接依赖于 depParentconfigParentconfigChild 的 super 配置。 configChild 具有直接依赖项 depAdepBdepB 依赖于 depB1depB1 依赖于 depB2

configChild.dependencies 将仅包含 depAdepBconfigChild.allDependencies 将仅包含 depParentdepAdepBconfigChild.incoming.artifacts 将包含依赖项 depParentdepAdepBdepB1depB2。同样,configChild.incoming.files 将包含依赖文件 depParentdepAdepB depB1depB2

我总结说配置的传入属性是其所有依赖项的解析,包括从 super 配置继承的依赖项。

关于gradle - Gradle 配置依赖和 Gradle 配置传入依赖有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47318323/

相关文章:

java - Maven是否比用于部署EAR项目的 Ant 构建工具更好?

gradle - 没有适用于组件的DSM数据(Gradle Multi-Project)

gradle - 如何在 Kotlin DSL 中为多模块项目创建 "base"gradle 文件?

gradle - Gradle ResultHandler返回null

android - 子文件夹产生 "Package R does not exist"

gradle - 将文件复制到 Gradle 中的 rootDir

java - 简单的Gradle Dagger Java示例

java - 为什么两个不同的gradle-project java文件可以放入同一个包中?

安卓 3.0.1 错误 :Unable to resolve dependency for ':app@debug/compileClasspath' : Could not resolve project :app2

gradle - 使用 gradle 将 'provided' 配置添加到 kotlin/java 库