0

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

我有一个根项目,在那个 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/')
    }
}

在子项目 build.gradle 中,我有如下依赖项:

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

在从 root 运行任务 copydependencies 时,我收到如下错误:

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

4

1 回答 1

2

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

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

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

但随后您将遇到其他问题,因为您想将不同的源复制到不同的目标目录(请参阅如何使用 Gradle 复制任务复制到多个目标?有关此问题的可能解决方案)

我认为更好的方法是创建不同的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
    }
}
于 2018-11-12T14:09:03.310 回答