Gradle:每个子项目的公共Zip任务

时间:2015-02-08 16:32:19

标签: gradle build.gradle multi-project

我有一个多项目gradle构建,其中根项目的所有子项目都有常见的zip任务。根据子项目的设置,他们应该压缩一些来源。

首先,我在父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原则。

我认为问题在于配置阶段是在配置子项目之前进行的。我怎样才能推迟"配置此任务,以便我只在子项目中配置ext.submissionFiles

1 个答案:

答案 0 :(得分:3)

我认为你是说submissionFiles是在子项目的build.gradle中设置的?

有几种方法可以做到这一点。

选项1.您可以通过将subproject.ext.submissionFiles包裹在closure中来推迟对task submission(type: Zip) { destinationDir = subproject.buildDir archiveName = subproject.name from ({ subproject.ext.submissionFiles }) } 的评估:

// In root
task submission(type: Zip) { 
    destinationDir = subproject.buildDir
    archiveName = subproject.name
}

// In child
submission {
    from("path/to/files")
}

选项2.我认为如果您没有使用中间变量(submissionFiles)并直接在子项中配置提交任务可能会更好:

{{1}}

使用类似的中间变量来移动配置可能会使您的构建更难理解任务之间的连接。


选项3.在某些情况下,使用evaluationDependsOnChildren()是有意义的,但我通常不会推荐它。