`targetExclude("**/build/**")` makes configuration cache store and reuse walk the entire project directory
Mantenedores costumam responder em até 1 dia
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Facilidade para iniciantes
- 43/100
- Tipo de issue
- Bug
- Clareza
- Claramente especificada
- Status de atividade
- Ativa
- Domínio
- build-system, performance
Direção de pesquisa
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.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
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
- A string
targetExcludebecomesproject.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. - The task target is
target.minus(targetExclude)(L1096). - With the default
GIT_ATTRIBUTES_FAST_ALLSAME, thelineEndingsPolicytask input isLazyAllTheSame(L1114). When the configuration cache serializes that input,LazyForwardingEquality.writeObjectcallscalculateState(), which runstoFormat.get().iterator()(GitAttributesLineEndings.java:92) just to get the first file. Iterating theSubtractingFileCollectionresolvesright.getFiles(), which walks the whole tree. - 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
- Linguagem predominante
- Java
- Estrelas
- 5.7k
- Forks
- 562
- Merge médio
- 3d 2h
- PRs com merge (30d)
- 30
Preparar o ambiente
- Sem Dockerfile nem arquivo Docker Compose
- Tem um modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de diffplug/spotless
-
Expose `maxLineLength` on the `googleJavaFormat` step (configurable upstream since gjf 1.37.0)Talvez já em andamento @xzxiaoshan assumiu há 2 dias. Aberta
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 28/100
Mantenedores costumam responder em até 1 dia
-
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 28/100
Mantenedores costumam responder em até 1 dia
-
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 68/100
Mantenedores costumam responder em até 1 dia
-
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 35/100
Mantenedores costumam responder em até 1 dia
-
Dificuldade 5/5 Mais de uma semana Facilidade para iniciantes 35/100
diffplug/spotless#3067 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
Todas as issues de diffplug/spotless
Issues semelhantes
-
pdfium-drift
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 88/100
Stirling-Tools/JPDFium#188 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
openremote/openremote#3487 · 1 comentário ·
-
Type/Bug U2
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 90/100
wso2/product-is#28675 ·
Mantenedores costumam responder em até 1 dia
-
a:bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 83/100
Mantenedores costumam responder em até 1 dia
-
bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
erupts/erupt#460 · 1 comentário ·
Mantenedores costumam responder em até 1 dia