从根本上讲,我基本上是在尝试获取每个子项目的依赖项,并复制到每个子项目中名为“ 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。
答案 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
}
}