Gradle 的术语评估和执行之间的区别

Posted

技术标签:

【中文标题】Gradle 的术语评估和执行之间的区别【英文标题】:Difference between Gradle's terms evaluation and execution 【发布时间】:2013-04-10 20:05:00 【问题描述】:

我是 Gradle 构建工具的新手,现在我正在阅读用户指南,但无法完全理解评估阶段和执行阶段之间的区别。

在配置阶段项目对象已配置并创建 DAG,但我们有 afterEvaluate,那么这里的评估是什么?评估任务依赖关系还是什么?

【问题讨论】:

【参考方案1】:

正如您在文档中看到的,分为三个阶段:初始化、配置和执行。每个步骤都从根项目遍历到子项目以进行多项目构建。当您想要基于子项目中的配置来配置特定项目时,afterEvaluate 在多项目构建的根 gradle 文件中很有用。

假设您要为定义了特定插件的所有子项目添加任务。如果你添加到你的根项目:

subprojects subProject ->
  if ( subProject.plugins.hasPlugin('myplugin'))
    subProject.task('newTask')<<
      println "This is a new task"
    
  

这个任务永远不会被添加,因为根项目是在子项目之前配置的。 添加 afterEvaluate 将为您解决这个问题:

subprojects subProject ->
  afterEvaluate
    if ( subProject.plugins.hasPlugin('myplugin'))
      subProject.task('newTask')<<
        println "This is a new task"
      
    
  

【讨论】:

那么 afterEvaluate 可以在完成其余配置后配置一些项目吗?类似于 doLast 的东西,但不适用于单独的任务,afterEvaluate 将其配置放在其他配置之后和执行之前。那么评估是在配置结束之后执行之前执行的吗?我说的对吗? 是的,你是对的。除了project.afterEvaluate,它在特定项目配置后运行,还有一个gradle.projectsEvaluated钩子,在所有项目配置后运行。 “这个任务永远不会被添加,因为根项目是在子项目之前配置的”。我无法理解该声明的相关性。 一切都与时间有关。如果你试图在事物存在之前对其进行配置,就会出现问题。

以上是关于Gradle 的术语评估和执行之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

评估堆栈和线程堆栈之间的区别

使用三元运算符或仅短路评估之间的区别?

Bash:评估一个数学术语?

Gradle 同步失败:评估设置时出现问题

汽车功能安全 - 危险分析和风险评估

汽车功能安全 - 危险分析和风险评估