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

Gradle 渐变-将子项目的依赖项复制到子项目的相应文件夹中,gradle,Gradle,从根目录中,我基本上尝试获取每个子项目的依赖项,并将其复制到每个子项目中名为dependency的目录中 我有一个根项目,在build.gradle文件中,我有一个任务,如下所示: task copyDependencies(type:Copy) { nonTestProjects.each { delete rootProject.project(it).file('dependencies') from rootProject.project(it)

从根目录中,我基本上尝试获取每个子项目的依赖项,并将其复制到每个子项目中名为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/')
    }
}
在子项目build.gradle中,我有如下依赖项:

 dependencies
 {
    implementation "com.google.protobuf:protobuf-java:$protobufVersion"
    implementation "io.netty:netty:$nettyVersion"
    implementation "xmlpull:xmlpull:$xmlPullVersion"
}
从根目录运行任务copydependencies时,我得到如下错误:

 dependencies
 {
    implementation "com.google.protobuf:protobuf-java:$protobufVersion"
    implementation "io.netty:netty:$nettyVersion"
    implementation "xmlpull:xmlpull:$xmlPullVersion"
}
无法获取类型为org.gradle.api.internal.artifacts.configurations.DefaultConfig的配置容器的未知属性“runtime” 集装箱


您收到错误
无法获取配置容器的未知属性“runtime”
,因为当gradle配置根项目并尝试创建任务
copyDependencies
时,子项目尚未评估,因此gradle在此阶段不知道“runtime”配置(
java
plugin尚未应用于子项目)

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

gradle.projectsEvaluated {
    task copyDependencies(type:Copy) {
        // task definition ...
    }
}
但是,由于要将不同的源复制到不同的目标目录,您将遇到其他问题(有关此问题的可能解决方案,请参阅)

我认为更好的方法是创建不同的
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
    }
}

您收到错误
无法获取配置容器的未知属性“runtime”
,因为当gradle配置根项目并尝试创建任务
copyDependencies
时,子项目尚未评估,因此gradle在此阶段不知道“runtime”配置(
java
plugin尚未应用于子项目)

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

gradle.projectsEvaluated {
    task copyDependencies(type:Copy) {
        // task definition ...
    }
}
但是,由于要将不同的源复制到不同的目标目录,您将遇到其他问题(有关此问题的可能解决方案,请参阅)

我认为更好的方法是创建不同的
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
    }
}