【问题标题】:Child build.gradle not evaluating at afterEvaluate eventChild build.gradle 未在 afterEvaluate 事件中进行评估
【发布时间】:2017-09-29 21:04:56
【问题描述】:

我有一个包含 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 文件,它现在总是返回为空。复制并过去回到一个 build.gradle 文件,工作正常,2个 gradle 文件,失败。

为什么会这样?

【问题讨论】:

  • 第21个子项目的build.gradle文件内容是什么?和这里引用的一样吗?另外,您提到了一个插件。你在写插件吗?
  • LOL,该项目是一系列插件。这是小的。第 21 个 build.gradle 文件的内容是一个自定义依赖编译器,用于几年前一些脑外科医生决定在我公司发明的一种语言。
  • 那么根项目是否知道子项目呢?你的settings.gradle?里有什么

标签: gradle


【解决方案1】:

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

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

实际上,如果显示的代码是您的实际代码,那还是有点奇怪。您将afterEvaluate 操作添加到所有项目,但仅在它是根项目时执行。您也可以将操作添加到根项目,然后省略条件。或者甚至更好,只需在每个项目中添加一个 afterEvaluate 来准确检查该项目,就像

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 2014-01-31
    • 1970-01-01
    • 2022-01-01
    相关资源
    最近更新 更多