Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

`targetExclude("**/build/**")` makes configuration cache store and reuse walk the entire project directory

オープン
#3,147 コメント 0 件 リアクション 1 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

まだ誰も着手していません。

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
43/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
java, kotlin

調査の方向性

Start with FormatExtension.java around lines 314 and 329, then trace target subtraction and the lineEndingsPolicy input around lines 1096 and 1114. Read GitAttributesLineEndings.java around line 92 and inspect the supplied configuration cache stack trace to understand when the file tree is traversed. Done means string targetExclude("**/build/**") avoids walking and fingerprinting unrelated project files during configuration cache store and reuse while preserving the exclusion behavior; the issue provides TestKit timing comparisons to reproduce and assess the change.

索引モデルが issue の本文から書いたものです。

説明

bug
Summary

A targetExclude string pattern that starts with ** makes configuration-cache store and reuse scale with the total number of files under the project directory. This happens even when target is already scoped to a few subfolders, as recommended in #2717 and #833.

spotless {
    kotlin {
        ktlint()
        target(
            "build-logic/**/*.kt",
            "build-logic/**/*.kts",
            "settings-logic/**/*.kt",
            "settings-logic/**/*.kts",
        )
        targetExclude("**/build/**")
    }
}

Measured with TestKit, Gradle 9.8.1, project dir containing ~100k unrelated files, spotlessKotlinCheck --dry-run:

Configuration CC store CC reuse
target(...) only ~70 ms ~50 ms
target(...) + targetExclude("**/build/**") ~1000 ms ~1250 ms
target(fileTree(".") { include(...); exclude("**/build/**") }) ~90 ms ~45 ms

With --no-configuration-cache all three configurations take under 100 ms at configuration time. In a real repo the walk covers .git, .gradle and every module's build output, so the cost grows with the size of the repo.

Root cause
  1. A string targetExclude becomes project.fileTree(projectDir).include("**/build/**") (FormatExtension.java:314). Gradle cannot prune a leading **, and the exclude branch returns before the default .git / .gradle / build-dir excludes are added (L329). So resolving this tree means walking the whole project directory.
  2. The task target is target.minus(targetExclude) (L1096).
  3. With the default GIT_ATTRIBUTES_FAST_ALLSAME, the lineEndingsPolicy task input is LazyAllTheSame (L1114). When the configuration cache serializes that input, LazyForwardingEquality.writeObject calls calculateState(), which runs toFormat.get().iterator() (GitAttributesLineEndings.java:92) just to get the first file. Iterating the SubtractingFileCollection resolves right.getFiles(), which walks the whole tree.
  4. Because this happens during configuration, Gradle records the collection as a configuration input (ConfigurationCacheFingerprintWriter.fileCollectionObserved) and snapshots the whole tree. On every later build the fingerprint check snapshots it again, so CC reuse is slow too.

Relevant stack excerpt from the store phase:

at org.gradle.internal.cc.impl.fingerprint.ConfigurationCacheFingerprintWriter.fileCollectionObserved
at org.gradle.api.internal.file.collections.DefaultConfigurableFileTree.getFiles
...
at com.diffplug.spotless.extra.GitAttributesLineEndings$LazyAllTheSame.calculateState
at com.diffplug.spotless.LazyForwardingEquality.state
at com.diffplug.spotless.LazyForwardingEquality.writeObject
at org.gradle.internal.serialize.codecs.core.jos.JavaObjectSerializationCodec$WriteObjectEncoding.encode
at org.gradle.internal.serialize.codecs.core.ProviderCodec.encode
at org.gradle.internal.serialize.codecs.core.TaskNodeCodec.writeTask

Replacing minus with filter { !targetExclude.contains(it) } is not enough: it only brings store to ~350 ms and reuse to ~640 ms. DefaultConfigurableFileTree.contains() also reports fileCollectionObserved during configuration, so the whole exclude tree still gets fingerprinted.

Related to

  • #833
  • #2717
主要言語
Java
スター
5.7k
フォーク
562
平均マージ
3日 2時間
マージ済み PR(30日)
30

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

diffplug/spotless のほかの issue

diffplug/spotless の issue をすべて見る

似ている issue

Java の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。