子build.gradle不在afterEvaluate事件中进行评估

时间:2017-09-29 00:11:12

标签: gradle

我有一个包含21个子项目的项目。其中一个子项目有自己的build.gradle文件,因为它有点模糊。

现在,我在配置阶段需要的构建中进行配置设置。所以,在我的插件中我有

project.afterEvaluate {
  if (project == project.rootProject) {
        project.allprojects.each { proj ->
      MetaExtension config = proj.getExtensions().getByType(MetaExtension)
      if (config.inventoryHash == null){
        throw new ProjectHashNotSetException(proj.name)
      }
    }
  }
}

现在,如果我在一个build.gradle文件中拥有所有内容,那么一切都很完美。但是,只要我将第21个子项目拆分为自己的build.gradle文件,它现在总是返回null。复制并过去回到一个build.gradle文件,工作正常,2个gradle文件,失败。

为什么会这样?

1 个答案:

答案 0 :(得分:0)

afterEvaluate是项目的一种方法,在评估项目后评估,而不是在评估所有项目之后评估。

您需要重构逻辑。你可以。 G。添加evaluationDependsOnChildren()evaluationDependsOn '21st-project',您根本不需要afterEvaluate

实际上,如果显示的代码是您的实际代码,那么无论如何都有点奇怪。您向所有项目添加afterEvaluate操作,但只有在它是根项目时才执行它。您也可以将操作添加到根项目中,然后省略条件。或者甚至更好,只需在每个项目中添加一个afterEvaluate,以完全检查该项目,如

project.afterEvaluate {
  MetaExtension config = extensions.getByType(MetaExtension)
  if (!config.inventoryHash) {
    throw new ProjectHashNotSetException(name)
  }
}

然后评估顺序并不重要,因为每个单独检查。如果你这样做,这对于项目解耦也更好。 G。曾经想要使用按需配置,这是你的方法无法实现的。