Gradle 配置有两个属性,称为 dependencies
和 incoming
.根据我的理解,我们可以通过 Gradle 依赖 block 向配置添加依赖,如下所示:
dependencies {
testCompile "junit:junit:4.12"
}
我希望在执行上述代码块后,testCompile.dependencies
将返回一个集合,其中至少包含 1 个表示 JUnit 依赖项的对象。
不过,我不确定 testCompile.incoming
将代表什么。
配置的dependencies
和incoming
属性之间有什么关系?使用传入属性的示例是什么?
最佳答案
我想我通过一些实验弄明白了。我首先使用 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.files
和 incoming.artifacts
包含 Hamcrest 依赖项的表示。这表明配置的 incoming
属性除了配置的直接依赖项的工件之外还包括配置的传递依赖项的工件。这似乎与配置的 transitive
属性有关。如果 transitive
属性设置为 false,则 incoming
属性将不包含配置的传递依赖项的工件;仅包含直接依赖项的工件。
请注意,配置的 allDependencies
属性不包括传递依赖项。相反,allDependencies
属性包括从 super 配置继承的依赖项。
这是一张图表,可以帮助解释我认为这些配置属性代表的含义:
configParent -- depParent
|
|
configChild -- depA
\- depB -- depB1 -- depB2
configParent
和configChild
是配置。 configParent
直接依赖于 depParent
。 configParent
是configChild
的 super 配置。 configChild
具有直接依赖项 depA
和 depB
。 depB
依赖于 depB1
,depB1
依赖于 depB2
。
configChild.dependencies
将仅包含 depA
和 depB
。 configChild.allDependencies
将仅包含 depParent
、depA
和 depB
。 configChild.incoming.artifacts
将包含依赖项 depParent
、depA
、depB
、depB1
和 depB2
。同样,configChild.incoming.files
将包含依赖文件 depParent
、depA
、depB
、 depB1
和 depB2
。
我总结说配置的传入属性是其所有依赖项的解析,包括从 super 配置继承的依赖项。
关于gradle - Gradle 配置依赖和 Gradle 配置传入依赖有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47318323/