gpt4 book ai didi

Gradle根据子项目属性配置任务

转载 作者:行者123 更新时间:2023-12-03 03:24:54 25 4
gpt4 key购买 nike

我正在尝试根据子项目内的属性之一配置 Zip 任务,但在配置任务时该属性尚无法访问。例如,我想从 zip 文件中排除所有具有 toexclude = true 的项目。因此,我想要排除的子项目的 build.gradle 以此开头:

ext.toexclude = true;
...

我的主要 build.gradle 有这个任务:

task zipContent (type: Zip){
def excludedProjects = allprojects.findAll{Project p -> p.toexclude == true}.collect{it.name}
println excludedProjects
destinationDir = "/some/path"
baseName = "myFile.zip"
exclude excludedProjects
from "/some/other/path"
}

问题是 excludedProjects 始终为空。事实上,当我执行任务时,我可以看到 []。我相信这是因为我在子项目的 build.gradle 中设置的属性在配置任务时不可用。作为证明,如果我将任务的第一行替换为:

def excludedProjects = allprojects.collect{it.name}

该任务打印出我的所有项目名称,并且 zip 中不包含任何内容(这意味着问题出在 p.toexclude == true 中)。

另外,如果我尝试这样做:

task zipContent (type: Zip){

def excludedProjects = []
doFirst{
excludedProjects = allprojects.findAll{Project p -> p.toexclude == true}.collect{it.name}
println "IN DOFIRST"
println excludedProjects
}

println "IN TASK CONFIG"
println excludedProjects
destinationDir = "/some/path"
baseName = "myFile.zip"
exclude excludedProjects
from "/some/other/path"
}

该任务打印出 IN TASK CONFIG ,后跟一个空数组,然后 IN DOFIRST ,该数组仅包含我设置的子项目 ext.toexclude = = true

那么,有没有办法在配置时获取子项目的属性呢?

最佳答案

那么,关键的问题是:在构建的哪个阶段所有必要的信息都可用?

由于我们想了解构建中的每个项目,其中额外的属性 toexclude 设置为 true 并且该属性可能(并且根据设计)是通过构建脚本设置,我们需要评估每个构建脚本。

现在,我们有两个选择:

  1. 默认情况下,子项目在父(根)项目之后进行评估。为了确保每个项目的评估,我们需要等待构建点,所有项目都被评估。 Gradle 为该点提供了一个监听器:

    gradle.addListener(new BuildAdapter() {
    @Override
    void projectsEvaluated(Gradle gradle) {
    tasks.getByPath('zipContent').with {
    exclude allprojects.findAll { it.toexclude }.collect{ it.name }
    }
    }
    })
  2. Gradle 提供了方法evaluationDependsOnChildren(),用于反转求值顺序。在查询排除的项目之前,可以通过调用此方法来使用原始方法。由于此方法仅适用于子项目,因此您可以尝试为构建中的每个项目调用 evaluationDependsOn(String),以也适用于“同级”项目。由于此解决方案破坏了 Gradle 默认行为,因此可能会产生不良副作用。

关于Gradle根据子项目属性配置任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49302762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com