为什么我的大型多项目gradle构建起步缓慢?

jwe*_*313 1 gradle build.gradle

我是一个拥有大型多项目构建(~350个模块)的团队,我们注意到进行单个构建(-a)仍然需要花费大量时间.在构建整套事物时,开销并不是那么糟糕,但是当我们做类似的事情时:

cd my/individual/project
gradle -a --configure-on-demand --daemon build
Run Code Online (Sandbox Code Playgroud)

在配置阶段(在它开始构建任何东西之前,它仍然需要30-40秒,我们使用--dry-run选项测量)

我们有大约10个自定义任务,我们正在设置这些任务的输入和输出,但我们仍然看到这个非常长的配置时间.我们正在使用gradle 1.10

Pet*_*ser 5

从远处说很难说.一个常见的错误是在配置阶段完成应该在执行阶段完成的工作.这是一个例子:

task myTask {
    copy {
        from ...
        to ...
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里,project.copy每次配置任务时都会调用该方法(因此将进行复制),这适用于每个单独的构建调用 - 无论运行哪个任务!要解决此问题,您需要将工作转移到任务操作中:

task myTask {
    doLast {
        copy {
            from ...
            into ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

甚至更好,使用预定义的任务类型:

task myTask(type: Copy) {
    from ...
    into ...
}
Run Code Online (Sandbox Code Playgroud)

您可以采取一些步骤来查找性能问题的原因:

  • 查看构建
  • 与运行--info,--debug--profile
  • 使用Java Profiler分析构建

PS:指定输入和输出不会缩短配置时间(但可能是执行时间).

  • 真奇怪.编译的脚本被缓存,类加载不应该是一个主要问题.如果在子项目中或在`allprojects/subprojects {}`下有`buildscript {}`块,请尝试用根构建脚本中的单个顶级`buildscript`块替换它们.确保你在`allprojects/subprojects`中不做任何耗时的事情,并确保构建(即守护程序进程)有足够的堆和permgen空间(可在`gradle.properties`中配置,请参阅Gradle用户指南).没有自己检查构建,这就是我所能说的. (5认同)
  • 仅仅为您的评论提供了答案.从子项目中删除buildscript {}块会使我的配置时间从~15(非常烦人)降低到~2s(非常容忍). (2认同)