如何加快 Gradle 依赖项解析速度或总体提高性能?

use*_*607 5 parallel-processing configuration groovy gradle

我正在从 Maven 转换一个非常大的构建。我已将许多 BOM 转换为依赖项列表。我还使用 Spring 依赖管理插件。

问题是依赖管理需要很长时间。请注意,即使我使用--offline. 我还刚刚读到使用allprojects {}andsubprojects{}会导致并行性失败。不过,显然我需要提供类似功能的东西。这次迁移的首要目标是提高性能,但到目前为止我认为没有任何改善。我需要知道:

如何在配置阶段设置依赖项列表,仅执行一次并确定其范围以便信息可供所有项目使用?有一个插件的例子可以做到这一点吗?当然,它必须与并行性一起工作。

我需要对 Spring 依赖管理插件做些什么来提高性能吗?

现在,构建时间大约为 25 分钟(离线运行),而且我使用的是一个还算不错的 8 核盒子。这是在守护进程运行的情况下进行的,没有单元或集成测试。:-/

Joa*_*son 2

如果不了解更多关于您的环境或设置的信息,很难说。但有一些一般规则:

  1. 您确定问题在于依赖项解析吗,请使用 --profile 获取更多信息。(参见文档

  2. 确保您只有一个存储库可供查看,最好是靠近您且速度快。我们通常会在 Nexus 中设置代理,这样我们就可以让 Nexus 为整个部门进行缓存。对于每个新存储库,Gradle 也会查找其中的所有版本。

  3. 确保您的 Gradle 缓存速度很快(考虑本地 SSD 与 NFS 安装的旧磁盘)。否则将您的 $GRADLE_USER_HOME 移动到另一个本地位置。

  4. 添加 DependencyResolutionListener 可能会为您提供有关瓶颈的更多信息。

尝试将以下内容添加到 build.gradle 的开头:

gradle.addListener(new DependencyResolutionListener() {
    ThreadLocal<Long> start = new ThreadLocal<>()
    @Override
    void beforeResolve(ResolvableDependencies dependencies) {
        start.set(System.nanoTime())
    }

    @Override
    void afterResolve(ResolvableDependencies dependencies) {
        long stop  = System.nanoTime() - start.get()
        println "resolving $dependencies.resolutionResult.root.moduleVersion of configuration $dependencies.name (${stop/1000000} ms)"
    }
})
Run Code Online (Sandbox Code Playgroud)