将一个非常大的Gradle项目与大量子项目分开的指南,使Gradle Build Faster和IntelliJ Gradle Refresh更快

Nic*_*zza 3 performance intellij-idea gradle

我有一个非常大的git项目,我有一个大的单个build.gradle定义子项目..在最初的几年......没问题.在最初几年之后,由于子项目的数量,它在Gradle命令行配置步骤中变得缓慢.

例如,当我运行gradle命令时,我看到暂停: > Configuring > 0/77 projects >...

每个项目添加似乎都会暂停.

另一个大问题是当我去导入项目或使用intelliJ刷新gradle deps时,"分析依赖关系"需要很长时间才能真正延迟开发,因为我们需要在每次同步依赖项时都有相当大的等待.

人们通常会在这个领域做些什么来通过这个?我不得不吃掉那种痛苦的延迟.

人们通常会将build.gradle文件拆分为不相关的块,以便您获得多项目构建的网络吗?或者应该有办法让那不是那么慢?

  • 我已经分析了依赖关系,实际上非常简单.
  • 按需,守护进程和并行部署以某种有限的方式发生.

但同样的问题是......

还有其他什么技巧?我的计划是将我的代码的主要部分分开并单独加载它们,以便gradle命令和intelliJ刷新是较小的UP-TO-DATE检查和配置设置.如果我们不必因为子项目限制而拆分build.gradle文件,那就太好了.

Ben*_*een 6

在我们对您的问题的评论进行讨论之后,很明显您不希望沿着将某些接口jar发布到存储库以删除某些子项目的路线.

鉴于此,这里有一些建议.我知道你已经尝试了其中的一些,但是这里有一些你上面没有提到的可能会对你有所帮助:

分析和干运行

首先,尝试使用以下命令:

    ./gradlew {task} --dry-run --profile
Run Code Online (Sandbox Code Playgroud)

这将使用名称执行任务的干运行{task}并在其下创建配置文件html文件$buildDir/reports/profile.您可以使用它来查看哪些任务占用了大部分时间,而不是通过配置,依赖项解析和任务执行.如果您可以看到一项任务需要花费很长时间,请查看它并查看是否可以减少该任务中发生的事情.

按需配置

要减少配置时间,请尝试在文件中启用按需配置,gradle.properties如下所示:

    org.gradle.configureondemand=true
Run Code Online (Sandbox Code Playgroud)

这意味着gradle将尝试仅配置运行任务所需的必要项目,而不是配置所有内容.

使用gradle守护程序

gradle守护程序是一个后台进程,当您的gradle任务完成时它不会退出,并且可以重复使用.这限制了每次构建时启动新gradle jvm进程的开销.要激活gradle守护程序,请将以下行添加到您的gradle.properties文件中:

    org.gradle.daemon=true
Run Code Online (Sandbox Code Playgroud)

使用最新版本的Gradle和Java

有些事情很简单,因为升级gradle版本可以提高速度.如果您尚未升级一段时间,或者使用相当旧的版本,请考虑升级.升级可能会有一些初步的痛苦,但从长远来看它是值得的.这同样适用于升级java版本.显然,由于其他限制,这并不总是可行,但请尝试使用最新的Java版本.

避免使用动态依赖项

Gradle允许您指定项目能够使用的依赖项的范围,如下所示:

dependencies {
    compile "commons-lang:commons-lang:2.+"
}
Run Code Online (Sandbox Code Playgroud)

这意味着gradle将始终尝试查找与约束匹配的最新版本的依赖项.这种灵活性会带来性能成本,因为gradle必须联机以检查要使用的版本.出于这个原因,以及其他一些我不会在这里讨论的内容,最好明确指定依赖的版本.

并行化构建

这允许并行构建不相关的子项目,从而加快构建过程.要启用此功能,请在以下位置设置gradle.properties:

org.gradle.parallel=true
Run Code Online (Sandbox Code Playgroud)

忽略不相关的任务

假设您要进行构建,但不一定要再次运行所有测试.您可以运行以下任务,并且不会运行测试任务.这可以显着增加构建时间:

./gradlew build -x test
Run Code Online (Sandbox Code Playgroud)

编辑 - 经过一些进一步的研究,在找到答案之后,我有了进一步的建议.

使用属性禁用构建的部分

如链接问题所示,如果您有一个项目而您只想在某些情况下运行功能测试,则可以将以下内容添加到根build.gradle文件中:

project('functional-tests') {
test {
    onlyIf {
        project.hasProperty("functionalTests")
    }
}
Run Code Online (Sandbox Code Playgroud)

}

这意味着只有在运行如下任务时才会运行功能测试:

./gradlew test -PfunctionalTests
Run Code Online (Sandbox Code Playgroud)

禁用settings.gradle中的某些子项目

您也可以禁用某些子项目,如下settings.gradle所示:

if (someBoolean) {
    include 'functional-tests'
}
Run Code Online (Sandbox Code Playgroud)