Gradle: 每个子项目的公共 Zip 任务
Gradle: Common Zip task for every subproject
我有一个多项目 gradle 构建,其中根项目的所有子项目都有共同的 zip 任务。他们应该压缩一些源代码,具体取决于子项目的设置。
首先,我在parent中配置了它build.gradle
:
subprojects { subproject ->
apply plugin: 'java'
...
task submission(type: Zip) {
destinationDir = subproject.buildDir
archiveName = subproject.name
from subproject.ext.submissionFiles
}
}
但这不适用于 Cannot get property 'submissionFiles' on extra properties extension as it does not exist
。所以我把任务移到每个子项目的 build.gradle
中,这违反了 DRY 原则。
我认为问题在于配置阶段发生在配置子项目之前。我如何 "defer" 配置此任务,以便我只在子项目中配置 ext.submissionFiles
?
我想你是说 submissionFiles
设置在子项目的 build.gradle?
有几种方法可以做到这一点。
选项 1。您可以通过将 subproject.ext.submissionFiles
包装在 closure:
中来推迟对 subproject.ext.submissionFiles
的计算
task submission(type: Zip) {
destinationDir = subproject.buildDir
archiveName = subproject.name
from ({ subproject.ext.submissionFiles })
}
方案二,我觉得如果不使用中间变量(submissionFiles),直接在children中配置提交任务会更好:
// In root
task submission(type: Zip) {
destinationDir = subproject.buildDir
archiveName = subproject.name
}
// In child
submission {
from("path/to/files")
}
使用这样的中间变量来移动配置会使您的构建更难理解任务之间的联系。
选项3。在某些情况下,使用evaluationDependsOnChildren()是有意义的,但我通常不推荐它。
我有一个多项目 gradle 构建,其中根项目的所有子项目都有共同的 zip 任务。他们应该压缩一些源代码,具体取决于子项目的设置。
首先,我在parent中配置了它build.gradle
:
subprojects { subproject ->
apply plugin: 'java'
...
task submission(type: Zip) {
destinationDir = subproject.buildDir
archiveName = subproject.name
from subproject.ext.submissionFiles
}
}
但这不适用于 Cannot get property 'submissionFiles' on extra properties extension as it does not exist
。所以我把任务移到每个子项目的 build.gradle
中,这违反了 DRY 原则。
我认为问题在于配置阶段发生在配置子项目之前。我如何 "defer" 配置此任务,以便我只在子项目中配置 ext.submissionFiles
?
我想你是说 submissionFiles
设置在子项目的 build.gradle?
有几种方法可以做到这一点。
选项 1。您可以通过将 subproject.ext.submissionFiles
包装在 closure:
subproject.ext.submissionFiles
的计算
task submission(type: Zip) {
destinationDir = subproject.buildDir
archiveName = subproject.name
from ({ subproject.ext.submissionFiles })
}
方案二,我觉得如果不使用中间变量(submissionFiles),直接在children中配置提交任务会更好:
// In root
task submission(type: Zip) {
destinationDir = subproject.buildDir
archiveName = subproject.name
}
// In child
submission {
from("path/to/files")
}
使用这样的中间变量来移动配置会使您的构建更难理解任务之间的联系。
选项3。在某些情况下,使用evaluationDependsOnChildren()是有意义的,但我通常不推荐它。