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()是有意义的,但我通常不推荐它。