Android / Gradle - 仅包含传递依赖项

时间:2018-04-05 07:01:28

标签: android gradle dependencies

在Android / Gradle项目中是否可以只包含特定模块的传递依赖项,而不包括该模块本身?

为了说明,假设模块XABC上具有传递依赖关系。我希望我的项目在类路径上有ABC,但不是 X。理想情况下,我想要做的是利用X已经知道我想要什么依赖项的事实,这样我就不必在AB上明确声明依赖关系,以及我的项目中C

假设,我想要的东西大概就像:

implementation(group: 'com.x', name: 'Xlib', version: '1.0', ...){
    transitive true                         //include 'A', 'B', and 'C'
    exclude group: 'com.x', module: 'Xlib'  //exclude 'X'
}

...在"提名X作为依赖项,获取其传递依赖关系,并忽略来自X"的所有顶级包。

有没有办法做到这一点,还是有必要明确声明ABC为依赖关系?

1 个答案:

答案 0 :(得分:2)

我在我的java-monkey-patch插件中完成了此here,其中我想要包含target工件的所有传递依赖项,但不包括target工件

dependencies {
    monkeyPatchTransitive target
    monkeyPatchNonTransitive target
    compileOnly(target) {
        transitive = false
    }
}

Set<Map>  depSet = [] as Set
ResolvedDependency topDependency = configurations.monkeyPatchTransitive.resolvedConfiguration.firstLevelModuleDependencies.iterator().next()
topDependency.children.each { ResolvedDependency child ->
    child.allModuleArtifacts.each { ResolvedArtifact artifact ->
        ModuleVersionIdentifier mvi = artifact.moduleVersion.id
        def dependency = [
                group  : mvi.group,
                name   : mvi.name,
                version: mvi.version,
                ext    : artifact.extension
        ]
        if (artifact.classifier) {
            dependency['classifier'] = artifact.classifier
        }
        depSet << dependency
    }
}

depSet.each { Map dependency ->
    logger.info "Adding $dependency"
    dependencies.compile(dependency) {
        transitive = false
    }
}