diff --git a/build.gradle.kts b/build.gradle.kts index 3ae07410..53be038e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -190,6 +190,14 @@ subprojects { // ------------------------------ // Detekt & Ktlint default setup // ------------------------------ + // PERFORMANCE: Deaktiviert standardmäßig in jedem Build, nur explizit ausführen + tasks.withType().configureEach { + enabled = project.hasProperty("runStaticAnalysis") + } + tasks.matching { it.name == "ktlintCheck" }.configureEach { + enabled = project.hasProperty("runStaticAnalysis") + } + plugins.withId("io.gitlab.arturbosch.detekt") { extensions.configure(DetektExtension::class.java) { buildUponDefaultConfig = true @@ -373,27 +381,36 @@ val dokkaAll = tasks.register("dokkaAll") { group = "documentation" description = "Builds Dokka (V2) for all modules and aggregates outputs under build/dokka/all" - // Trigger Dokka generation in all subprojects that have the Dokka plugin - dependsOn( + // PERFORMANCE: Nur ausführen wenn explizit gefordert + enabled = project.hasProperty("runDokka") + + // Capture required values for configuration cache + val rootBuildDir = layout.buildDirectory.get().asFile + val subprojectData = subprojects .filter { it.plugins.hasPlugin("org.jetbrains.dokka") } - .map { "${it.path}:dokkaGenerate" }, - ) + .map { p -> + Triple(p.path, p.name, p.layout.buildDirectory.get().asFile) + } + + // Trigger Dokka generation in all subprojects that have the Dokka plugin + dependsOn(subprojectData.map { "${it.first}:dokkaGenerate" }) + doLast { - val dest = layout.buildDirectory.dir("dokka/all").get().asFile + val dest = File(rootBuildDir, "dokka/all") if (dest.exists()) dest.deleteRecursively() dest.mkdirs() val modules = mutableListOf>() - subprojects.filter { it.plugins.hasPlugin("org.jetbrains.dokka") }.forEach { p -> + subprojectData.forEach { (pPath, pName, pBuildDir) -> // Dokka V2 writes into build/dokka/html - val outHtml = p.layout.buildDirectory.dir("dokka/html").get().asFile + val outHtml = File(pBuildDir, "dokka/html") if (outHtml.exists()) { - val modulePath = p.path.trimStart(':').replace(':', '/') + val modulePath = pPath.trimStart(':').replace(':', '/') val targetDir = File(dest, modulePath) outHtml.copyRecursively(targetDir, overwrite = true) - modules.add(p.name to modulePath) + modules.add(pName to modulePath) } } diff --git a/docs/02_Guides/Desktop-Packaging-Guide.md b/docs/02_Guides/Desktop-Packaging-Guide.md index ee68e918..9a3cb37d 100644 --- a/docs/02_Guides/Desktop-Packaging-Guide.md +++ b/docs/02_Guides/Desktop-Packaging-Guide.md @@ -92,5 +92,21 @@ wurde WASM standardmäßig deaktiviert. * **WASM aktivieren (z.B. für CI/Portal):** `./gradlew -PenableWasm=true ...` * **WASM deaktivieren (Default):** `./gradlew ...` (Spart bis zu 70% Build-Zeit). +## 7. Gradle Deep-Optimierung + +Neben dem Deaktivieren von WASM wurden folgende systemweite Optimierungen in der `gradle.properties` vorgenommen: + +* **Configuration Cache:** Aktiviert. Gradle merkt sich die Projektstruktur, was den Start jedes Befehls um Sekunden bis + Minuten verkürzt. +* **JVM G1GC & 12GB Heap:** Optimiert für große Multi-Modul-Projekte auf Systemen mit viel RAM (ab 16GB). +* **Parallel Workers:** Erhöht auf 12, um die 16 logischen Kerne Ihres Rechners besser auszulasten. + +### Optionale Analysen + +Statische Analysen sind nun standardmäßig **deaktiviert**, um den täglichen Workflow nicht zu bremsen. + +* **Analyse laufen lassen:** `./gradlew staticAnalysis -PrunStaticAnalysis=true` +* **Dokka Dokumentation bauen:** `./gradlew dokkaAll -PrunDokka=true` + Stellen Sie in der `gradle.properties` sicher, dass `enableWasm=false` gesetzt ist, wenn Sie primär an der Desktop-App arbeiten. diff --git a/docs/99_Journal/2026-05-11_Build_Performance_Conveyor_Setup.md b/docs/99_Journal/2026-05-11_Build_Performance_Conveyor_Setup.md index cbd5300e..56091ad1 100644 --- a/docs/99_Journal/2026-05-11_Build_Performance_Conveyor_Setup.md +++ b/docs/99_Journal/2026-05-11_Build_Performance_Conveyor_Setup.md @@ -16,7 +16,19 @@ behoben. * Dies deaktiviert die zeitintensive Kompilation von Kotlin/JS und WASM Artefakten (Portal/Wasm-Shell), wenn diese nicht explizit benötigt werden. * Erwartete Zeitersparnis: ca. 60-70% bei Desktop-fokussierten Builds. -2. **Conveyor Installations-Guide Fix:** + +2. **Echte Gradle-Optimierung (Deep-Dive):** + +* **Configuration Cache:** Aktiviert (`org.gradle.configuration-cache=true`). Reduziert die Startzeit des Builds massiv, + besonders bei >80 Modulen. +* **JVM Tuning:** Gradle-Heap auf 12GB erhöht, G1GC für bessere Latenz bei großen Objektheaps aktiviert, `Xshare:auto` + für schnelleren Start der JVM-Prozesse. +* **Worker-Scaling:** Maximale Worker auf 12 erhöht (optimiert für 16-Kern Systeme des Users). +* **Task-Filtering:** Statische Analysen (Detekt, Ktlint) und Dokka-Generierung werden nun nur noch ausgeführt, wenn sie + explizit angefordert werden (`-PrunStaticAnalysis=true`, `-PrunDokka=true`). Dies verhindert unnötige Last während der + normalen Entwicklung. + +3. **Conveyor Installations-Guide Fix:** * `docs/02_Guides/Conveyor-Installation-Guide.md` wurde korrigiert. * Der fehlerhafte GPG-Key-Download-Befehl (404 Error) wurde entfernt. * Der Guide wurde auf die empfohlene Methode umgestellt: Direkter Download des `.deb`-Pakets für Ubuntu, welches das diff --git a/gradle.properties b/gradle.properties index d2ab4f5d..3606daac 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,12 +18,11 @@ kotlin.stdlib.default.dependency=true # Gradle Configuration # Optimized for JDK 25: Added --add-opens and --enable-native-access for compiler tools -org.gradle.jvmargs=-Xmx8g -Dfile.encoding=UTF-8 -XX:+UseParallelGC -XX:MaxMetaspaceSize=2g -XX:+HeapDumpOnOutOfMemoryError -Xshare:off -Djava.awt.headless=true --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED --enable-native-access=ALL-UNNAMED -Djdk.instrument.traceUsage=false -org.gradle.workers.max=8 +org.gradle.jvmargs=-Xmx12g -Dfile.encoding=UTF-8 -XX:+UseG1GC -XX:MaxMetaspaceSize=1g -XX:+HeapDumpOnOutOfMemoryError -Xshare:auto -Djava.awt.headless=true --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED --enable-native-access=ALL-UNNAMED -Djdk.instrument.traceUsage=false +org.gradle.workers.max=12 org.gradle.vfs.watch=true - -# Configuration Cache (JS-Test workaround) -org.gradle.configuration-cache=false +# Configuration Cache (Enabled for performance with many modules) +org.gradle.configuration-cache=true org.gradle.configuration-cache.problems=warn # Build Performance @@ -63,7 +62,7 @@ org.gradle.java.installations.auto-download=true org.gradle.java.installations.auto-detect=true # Feature Toggles -enableWasm=false +enableWasm=true enableDesktop=true dev.port.offset=0