【问题标题】:Android/Gradle - Include transitive dependencies onlyAndroid/Gradle - 仅包含传递依赖
【发布时间】:2018-04-05 07:01:28
【问题描述】:

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

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

假设,我想要的大概是这样的:

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 显式声明为依赖项?

【问题讨论】:

  • 好问题。我的用例是:我有一个包含在影子 jar 中的依赖项,但我不想在影子 jar 中包含传递依赖项,我希望将它们指定为影子 jar 的依赖项。

标签: android gradle dependencies


【解决方案1】:

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

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
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多