Performance 将一个非常大的Gradle项目与许多子项目分开以使Gradle构建更快、IntelliJ Gradle刷新更快的指南

Performance 将一个非常大的Gradle项目与许多子项目分开以使Gradle构建更快、IntelliJ Gradle刷新更快的指南,performance,intellij-idea,gradle,Performance,Intellij Idea,Gradle,我有一个相当大的git项目,我有一个定义子项目的大型单build.gradle。。在最初的几年里。。。没问题。在最初几年之后,由于子项目的数量,Gradle命令行配置步骤变得有点慢 例如,当我运行gradle命令时,我会在以下位置看到暂停: >配置>0/77项目> 每增加一个项目,暂停的时间就越长 另一个大问题是,当我导入项目或使用intelliJ刷新gradle deps时,“分析依赖项”会花费很长时间,这实际上会延迟开发,因为每次同步依赖项时,我们都需要相当长的等待时间 在这个领域,人们通常

我有一个相当大的git项目,我有一个定义子项目的大型单build.gradle。。在最初的几年里。。。没问题。在最初几年之后,由于子项目的数量,Gradle命令行配置步骤变得有点慢

例如,当我运行gradle命令时,我会在以下位置看到暂停:
>配置>0/77项目>

每增加一个项目,暂停的时间就越长

另一个大问题是,当我导入项目或使用intelliJ刷新gradle deps时,“分析依赖项”会花费很长时间,这实际上会延迟开发,因为每次同步依赖项时,我们都需要相当长的等待时间

在这个领域,人们通常做什么来通过考试?我不得不吃了延迟,这是痛苦的

人们是否通常将build.gradle文件分割成不相关的块,以便获得多项目构建的网络?还是应该有一种方法让它不那么慢

  • 我已经分析了依赖关系,实际上都很简单
  • Ondemand、守护进程和并行部署以某种有限的方式进行
但同样的问题仍然存在


还有什么别的把戏?我的计划是将代码的主要部分分为多个部分,并独立加载它们,这样gradle命令和intelliJ刷新会更小,以便于进行最新的检查和配置设置。如果我们不必因为子项目的限制而拆分build.gradle文件,那就太好了。

在我们对您的问题的评论中进行讨论之后,很明显,您不想通过将一些接口JAR发布到存储库来删除一些子项目

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

仿形和试运行 首先,尝试使用以下命令:

    ./gradlew {task} --dry-run --profile
这将执行名为
{task}
的任务的试运行,并在
$buildDir/reports/profile
下创建一个配置文件html文件。您可以使用它来查看哪些任务在整合、依赖项解析和任务执行过程中占用了大部分时间。如果你能看到一项任务花费了特别长的时间,看看它,看看你是否能减少该任务中发生的事情

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

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

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

    org.gradle.daemon=true
project('functional-tests') {
test {
    onlyIf {
        project.hasProperty("functionalTests")
    }
}
使用Gradle和Java的最新版本 有些事情很简单,升级gradle版本可以提高速度。如果您没有升级一段时间,或者正在使用一个相当旧的版本,请考虑升级。升级初期可能会有一些痛苦,但从长远来看是值得的。这同样适用于升级java版本。显然,由于其他限制,这并不总是可能的,但是请尝试使用最新的java版本

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

dependencies {
    compile "commons-lang:commons-lang:2.+"
}
这意味着gradle将始终尝试查找与约束匹配的依赖项的最新版本。这种灵活性是以性能为代价的,因为gradle必须在线检查要使用的版本。出于这个原因,以及其他一些我在这里不讨论的原因,明确指定依赖项的版本是一个好主意

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

org.gradle.parallel=true
忽略不相关的任务 假设您想进行构建,但不一定要再次运行所有测试。您可以运行以下任务,但测试任务将不会运行。这会显著增加构建时间:

./gradlew build -x test
编辑——经过进一步的研究,在发现之后,我有了进一步的建议

使用属性禁用部分生成 如链接问题所示,如果您有一个项目,并且只想在某些情况下运行功能测试,则可以将以下内容添加到根
build.gradle
文件中:

    org.gradle.daemon=true
project('functional-tests') {
test {
    onlyIf {
        project.hasProperty("functionalTests")
    }
}
}

这意味着仅当您运行以下任务时,才会运行功能测试:

./gradlew test -PfunctionalTests
禁用settings.gradle中的某些子项目 您还可以在
设置.gradle
中禁用某些子项目,如下所示:

if (someBoolean) {
    include 'functional-tests'
}

有很多外部依赖关系吗?您的子项目是否相互依赖?如果是这样,您是否将它们作为项目依赖项或对生成的工件的依赖项引用?@BenGreen第三方依赖项的数量是合理的。是的,我们有内在的依赖。我们使用子项目是因为我们不想进入mavenPublish世界。那么,您是否要将这些项目JAR构建到外部存储库中?不。这都是gradle缓存。嗯,要避免这种情况可能相当棘手。我们打算建议为所有领域的东西建立一个单独的项目,这个项目不会有太大的变化,但是如果每个人都必须在本地构建一个最新版本,那么你就会遇到问题。将有一个想法。如何使用“启用和禁用”子项目