从Gradle 4.1上的解析配置中获取依赖关系

时间:2017-12-01 10:39:37

标签: android gradle

在Gradle的以前版本的android插件中,我可以通过自己的任务,使用以下方法获取jar依赖项的路径:

android.libraryVariants.all { variant ->
    task "copyDependencies${variant.name.capitalize()}"(type: Copy) {
        configurations.compile.files().each { dependency ->
            from dependency.path
        }
        into project.projectDir.path + "/build/libs/${variant.name}"
    }
}

但是在此插件的最新版本中,compile传递给已弃用,并且他们引入了apiimplementation配置,因此当我尝试使用之前的代码时,gradle说:

  

解决配置' api'直接不允许

对这一新变化提出了什么建议吗?

更新

我有一个依赖项列表并过滤了这样做的配置:

android.libraryVariants.all { variant ->

    task "copyDependencies${variant.name.capitalize()}"(type: Copy) {
        from {
            variant.getCompileConfiguration().files().each { dependency ->
                configurations.api.getDependencies().each { configDep ->
                    if (dependency.name.contains(configDep.name)) {
                        from dependency.path
                    }
                }
            }
        }
        into project.projectDir.path + "/build/libs/${variant.name}"
    }
}

但是,当项目B依赖于项目A时,这个解决方案仍然存在问题。无论是否定义了此任务,Gradle都不会构建。

2 个答案:

答案 0 :(得分:1)

最后,我从配置中找到了复制依赖关系的解决方案:

android.libraryVariants.all { variant ->
    task "copyDependencies${variant.name.capitalize()}"() {
        outputs.upToDateWhen { false }
        doLast {
            println "Executing from in copyDependencies${variant.name.capitalize()}"
            variant.getCompileConfiguration().getAllDependencies().each { dependency ->
                configurations.api.getDependencies().each { configDep ->
                    if (dependency.name.contains(configDep.name)) {
                        println "Dependency detected: " + dependency.name
                        variant.getCompileClasspath().each { fileDependency ->
                            if (fileDependency.absolutePath.contains(dependency.name)) {
                                println fileDependency.absolutePath
                                copy {
                                    from fileDependency.absolutePath
                                    into project.projectDir.path + "/build/intermediates/bundles/${variant.name}/libs"
                                    exclude '**/classes.jar'
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

答案 1 :(得分:-3)

请参阅用户指南的chapter 48.4以查找所有可用配置以及要使用和/或解决的配置。