【问题标题】:Gradle: Common Zip task for every subprojectGradle:每个子项目的通用 Zip 任务
【发布时间】:2015-02-09 06:44:24
【问题描述】:

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

【问题讨论】:

  • “submissionFiles”是由另一个任务创建的吗?

标签: gradle build.gradle multi-project


【解决方案1】:

我想你是说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 })
}

方案2,我觉得不使用中间变量(submissionFiles),直接在children中配置提交任务会更好:

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

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

使用这样的中间变量来移动配置会使您的构建更难理解任务之间的联系。


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

【讨论】:

  • 我喜欢第二个变种!
  • 问题是,在第一个示例中 from ({ subproject.ext.submissionFiles }) 有效,但我无法让 destinationDir = subproject.buildDir 工作。错误消息是:```无法为项目 ':sub-project-name' 获取未知属性 'buildDir'。当然必须在根项目中编写这个,以便在配置周期中放入变量?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多