gpt4 book ai didi

performance - 将一个非常大的 Gradle 项目与许多子项目分开以使 Gradle Build Faster 和 IntelliJ Gradle Refresh 更快的指南

转载 作者:行者123 更新时间:2023-12-04 02:55:48 26 4
gpt4 key购买 nike

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

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

随着每个项目的添加,暂停似乎变得更大。

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

人们在该领域通常会做什么来通过这个?我不得不忍受痛苦的延迟。

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

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

  • 但同样的问题存在...

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

    最佳答案

    在我们对您的问题的评论中进行了讨论之后,很明显您不想沿着将一些接口(interface) jar 发布到存储库以删除一些子项目的路线。

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

    分析和试运行

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

        ./gradlew {task} --dry-run --profile

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

    按需配置

    要减少配置时间,请尝试启用 configuration on demand在您的 gradle.properties像这样的文件:
        org.gradle.configureondemand=true

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

    使用 gradle 守护进程

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

    使用最新版本的 Gradle 和 Java

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

    避免使用动态依赖

    Gradle 允许您指定项目能够使用的依赖项的范围,如下所示:
    dependencies {
    compile "commons-lang:commons-lang:2.+"
    }

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

    并行化构建

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

    忽略不相关的任务

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

    编辑 -- 经过进一步研究,发现 this answer ,我有进一步的建议。

    使用属性禁用部分构建

    如链接的问题所示,如果您有一个项目并且只想在某些情况下运行功能测试,您可以将以下内容添加到根目录 build.gradle文件:
    project('functional-tests') {
    test {
    onlyIf {
    project.hasProperty("functionalTests")
    }
    }

    }

    这意味着仅当您运行如下任务时才会运行功能测试:
    ./gradlew test -PfunctionalTests

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

    您还可以禁用 settings.gradle 中的某些子项目。像这样:
    if (someBoolean) {
    include 'functional-tests'
    }

    关于performance - 将一个非常大的 Gradle 项目与许多子项目分开以使 Gradle Build Faster 和 IntelliJ Gradle Refresh 更快的指南,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42593535/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com