提问者:小点点

Gradle:每个子项目的通用Zip任务


我有一个多项目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


共1个答案

匿名用户

我想你是说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。在某些情况下,使用评估依赖于儿童()是有意义的,但我通常不推荐它。