Gradle-将子项目的依赖关系复制到子项目的相应文件夹中

时间:2018-11-12 13:01:26

标签: gradle

从根本上讲,我基本上是在尝试获取每个子项目的依赖项,并复制到每个子项目中名为“ dependency”的目录中。

我有一个根项目,在该build.gradle文件中,我的任务如下:

task copyDependencies(type:Copy) {

    nonTestProjects.each {
        delete rootProject.project(it).file('dependencies')
        from rootProject.project(it).configurations.runtime
        intorootProject.project(it).file('dependencies/')
    }
}

在Sub Projects build.gradle中,我具有以下依赖关系:

 dependencies
 {
    implementation "com.google.protobuf:protobuf-java:$protobufVersion"
    implementation "io.netty:netty:$nettyVersion"
    implementation "xmlpull:xmlpull:$xmlPullVersion"
}

从根目录运行任务copydependencies时,出现以下错误:

  

无法获取类型为org.gradle.api.internal.artifacts.configurations.DefaultConfig的配置容器的未知属性“运行时”   urationContainer。

1 个答案:

答案 0 :(得分:1)

您收到错误Could not get unknown property 'runtime' for configuration container,因为当gradle配置根项目并尝试创建任务copyDependencies时,尚未评估子项目,因此Gradle不了解“运行时”配置在此阶段(java插件尚未应用于子项目)。

因此,一种解决方案是将创建的任务包装到gradle.projectsEvaluated生命周期挂钩中:

gradle.projectsEvaluated {
    task copyDependencies(type:Copy) {
        // task definition ...
    }
}

但是您将遇到其他问题,因为您要将不同的源复制到不同的目标目录(有关此问题的可能解决方案,请参见How to copy to multiple destinations with Gradle copy task?

我认为更好的方法是创建不同的copyDependencies任务,每个子项目一个,并在根项目中创建一个“聚合器”任务,该任务将取决于这些子项目的任务:

// aggregator task at root project level
task copyDependencies

// create copydependencies task for each (non-test) subproject
gradle.projectsEvaluated {
    nonTestProjects.each {
        Project proj = project(it)
        Task task = proj.task('copyDependencies', type: Copy) {
            from proj.configurations.runtimeClasspath
            into proj.file("dependencies")
            doFirst {
                file('dependencies').deleteDir()
            }
        }
        copyDependencies.dependsOn task
    }
}