我有一个多项目gradle构建,其中根项目的所有子项目都有共同的zip任务。他们应该压缩一些源代码,具体取决于子项目的设置。
首先,我在父build. gradle
中配置了它:
subprojects { subproject ->
apply plugin: 'java'
...
task submission(type: Zip) {
destinationDir = subproject.buildDir
archiveName = subproject.name
from subproject.ext.submissionFiles
}
}
但是这不适用于无法在额外的属性扩展上获取属性'submissionFiles',因为它不存在
。所以我在每个子项目的build. gradle
中移动了任务,这违反了DRY原则。
我认为问题是配置阶段发生在子项目配置之前。我如何“推迟”这个任务的配置,以便我只在子项目中配置ext. submissionFiles
?
我想你是说submissionFiles
设置在子项目的build. gradle中?
有几种方法可以做到这一点。
选项1.您可以通过将subproject. ext.submissionFiles
包装在闭包中来推迟对的评估:
task submission(type: Zip) {
destinationDir = subproject.buildDir
archiveName = subproject.name
from ({ subproject.ext.submissionFiles })
}
选项2.我认为如果不使用中间变量(submissionFiles)并直接在子级中配置提交任务会更好:
// In root
task submission(type: Zip) {
destinationDir = subproject.buildDir
archiveName = subproject.name
}
// In child
submission {
from("path/to/files")
}
使用这样的中间变量来移动配置会使您的构建更难理解任务之间的连接。
选项3。在某些情况下,使用评估依赖于儿童()是有意义的,但我通常不推荐它。