乐闻世界logo
搜索文章和话题

Gradle 的生命周期包括哪些阶段?每个阶段的作用是什么?

2月21日 18:10

Gradle 的生命周期分为三个主要阶段:

1. 初始化阶段(Initialization Phase)

  • 作用:确定哪些项目将参与构建,并为每个项目创建 Project 实例
  • 执行内容
    • 读取 settings.gradlesettings.gradle.kts 文件
    • 根据 include 语句确定项目结构
    • 为每个包含的项目创建 Project 实例
    • 执行 init.gradle(如果存在)
  • 示例
    groovy
    // settings.gradle rootProject.name = 'my-project' include 'app', 'library', 'common'

2. 配置阶段(Configuration Phase)

  • 作用:执行所有项目的构建脚本,构建任务依赖图
  • 执行内容
    • 执行每个项目的 build.gradlebuild.gradle.kts
    • 配置项目属性、插件、依赖
    • 创建和配置所有任务
    • 建立任务之间的依赖关系
  • 特点
    • 即使只执行一个任务,也会配置所有项目
    • 可以通过 gradle -m--dry-run 查看将要执行的任务
  • 优化技巧
    groovy
    // 使用 onlyIf 或 enabled 来跳过不必要的配置 tasks.register('myTask') { onlyIf { project.hasProperty('enableMyTask') } }

3. 执行阶段(Execution Phase)

  • 作用:按照任务依赖图执行实际的任务
  • 执行内容
    • 只执行在命令行中指定的任务及其依赖任务
    • 执行任务的 action 逻辑
    • 支持增量构建,只处理变更的文件
  • 特点
    • 任务的执行顺序由依赖关系决定
    • 支持并行执行(通过 --parallel 参数)
    • 支持持续构建(通过 --continuous 参数)

生命周期钩子

Gradle 提供了多个生命周期钩子来在特定阶段执行自定义逻辑:

groovy
// 初始化阶段 gradle.projectsLoaded { println "所有项目已加载" } // 配置阶段 gradle.beforeProject { project -> println "配置项目: ${project.name}" } gradle.afterProject { project -> println "项目 ${project.name} 配置完成" } // 执行阶段 gradle.taskGraph.whenReady { graph -> println "任务图已准备就绪" } gradle.taskGraph.beforeTask { task -> println "准备执行任务: ${task.name}" } gradle.taskGraph.afterTask { task, state -> println "任务 ${task.name} 执行完成,状态: ${state.failure ? '失败' : '成功'}} }

性能优化建议

  1. 减少配置阶段的工作量:将不必要的逻辑移到执行阶段
  2. 使用延迟初始化:使用 tasks.register() 而不是 tasks.create()
  3. 避免在配置阶段进行 I/O 操作:如网络请求、文件读写等
  4. 使用配置缓存:通过 --configuration-cache 参数启用
标签:Gradle