首页 文章

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

提问于
浏览
1

在以前版本的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'

是否有任何关于这一新变化的建议?


UPDATE

我有一个依赖项列表和过滤器配置这样做:

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 回答

  • 1

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

  • -3

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

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

相关问题