簡體   English   中英

如何修復緩慢的 gradle 清潔構建

[英]how to fix a slow gradle clean build

為這個問題的開放性道歉,但我有一個 java/spring-boot/gradle 項目,每當我運行./gradlew clean build時,構建總是需要很長時間(大約 10 分鍾,而其他團隊大約 1 分鍾)成員在他們的筆記本電腦上構建相同的項目) - 我不知道為什么會這樣,所以任何人都知道從哪里開始/我需要提取/分析什么信息來找到這個問題的原因(很高興發布任何請求的信息作為對問題的編輯)。

首先,在您的 gradle-wrapper.properties 中,添加以下內容:

org.gradle.caching=true
org.gradle.parallel=true

看看它是否有幫助。 它應該。

其次,您可能想要實現一個TaskExecutionListener並將其注冊到gradle.taskGraph.addTaskExecutionListener 建議來自Peter Niederwieser本人。

簡而言之,在您的頂級gradle.build中,復制以下內容:

import java.util.concurrent.TimeUnit

class TimingsListener implements TaskExecutionListener, BuildListener {
    private long startTime
    private timings = []

    @Override
    void beforeExecute(Task task) {
        startTime = System.nanoTime()
    }

    @Override
    void afterExecute(Task task, TaskState taskState) {
        def ms = TimeUnit.MILLISECONDS.convert(System.nanoTime() - startTime, TimeUnit.NANOSECONDS);
        timings.add([ms, task.path])
        task.project.logger.warn "${task.path} took ${ms}ms"
    }

    @Override
    void buildFinished(BuildResult result) {
        println "Task timings:"
        for (timing in timings) {
            if (timing[0] >= 50) {
                printf "%7sms  %s\n", timing
            }
        }
    }

    @Override
    void buildStarted(Gradle gradle) {}

    @Override
    void projectsEvaluated(Gradle gradle) {}

    @Override
    void projectsLoaded(Gradle gradle) {}

    @Override
    void settingsEvaluated(Settings settings) {}
}

gradle.addListener new TimingsListener()

output 可能看起來像:

gradlew build

> Task :compileJava UP-TO-DATE
:compileJava took 3255ms

> Task :processResources UP-TO-DATE
:processResources took 10ms

> Task :classes UP-TO-DATE
:classes took 0ms

> Task :bootWar UP-TO-DATE
:bootWar took 637ms

> Task :war SKIPPED
:war took 0ms

> Task :assemble UP-TO-DATE
:assemble took 0ms

> Task :compileTestJava UP-TO-DATE
:compileTestJava took 427ms

> Task :processTestResources UP-TO-DATE
:processTestResources took 5ms

> Task :testClasses UP-TO-DATE
:testClasses took 0ms

> Task :test UP-TO-DATE
:test took 62ms

> Task :check UP-TO-DATE
:check took 0ms

> Task :build UP-TO-DATE
:build took 0ms
Task timings:
   3255ms  :compileJava
    637ms  :bootWar
    427ms  :compileTestJava
     62ms  :test

獎金

您還可以通過在 build.gradle 中使用來加快測試速度:

test {
    maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1 
}

請注意,如果您確實並行運行測試,則必須確保它們是獨立的,即不共享資源,無論是文件、數據庫還是其他東西。 否則,測試可能會以隨機和不可預測的方式相互干擾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM