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