From 04b3d9b1d526dc0c7826db0170c30bf16bd9508f Mon Sep 17 00:00:00 2001 From: ulfrxdev Date: Sun, 26 Apr 2026 22:22:28 +0200 Subject: [PATCH] Remove unnecessary convention plugins --- build-logic/build.gradle.kts | 8 --- .../recipe.android.application.gradle.kts | 35 ---------- .../recipe.compose.multiplatform.gradle.kts | 27 -------- .../main/kotlin/recipe.jvm.server.gradle.kts | 42 ------------ .../recipe.kotlin.multiplatform.gradle.kts | 19 ++---- composeApp/build.gradle.kts | 66 ++++++++++++++++--- server/build.gradle.kts | 33 +++++++++- shared/build.gradle.kts | 25 ++----- 8 files changed, 102 insertions(+), 153 deletions(-) delete mode 100644 build-logic/src/main/kotlin/recipe.android.application.gradle.kts delete mode 100644 build-logic/src/main/kotlin/recipe.compose.multiplatform.gradle.kts delete mode 100644 build-logic/src/main/kotlin/recipe.jvm.server.gradle.kts diff --git a/build-logic/build.gradle.kts b/build-logic/build.gradle.kts index 4ffd86f..851ad7f 100644 --- a/build-logic/build.gradle.kts +++ b/build-logic/build.gradle.kts @@ -4,15 +4,7 @@ plugins { dependencies { compileOnly(libs.plugins.kotlinMultiplatform.asDependency()) - compileOnly(libs.plugins.androidApplication.asDependency()) - compileOnly(libs.plugins.composeMultiplatform.asDependency()) - compileOnly(libs.plugins.composeCompiler.asDependency()) - compileOnly(libs.plugins.composeHotReload.asDependency()) - compileOnly(libs.plugins.kotlinJvm.asDependency()) - compileOnly(libs.plugins.kotlinSerialization.asDependency()) - compileOnly(libs.plugins.ktor.asDependency()) compileOnly(libs.plugins.spotless.asDependency()) - compileOnly(libs.plugins.flywayPlugin.asDependency()) } fun Provider.asDependency(): Provider = diff --git a/build-logic/src/main/kotlin/recipe.android.application.gradle.kts b/build-logic/src/main/kotlin/recipe.android.application.gradle.kts deleted file mode 100644 index bce88da..0000000 --- a/build-logic/src/main/kotlin/recipe.android.application.gradle.kts +++ /dev/null @@ -1,35 +0,0 @@ -import org.gradle.api.artifacts.VersionCatalogsExtension -import org.gradle.kotlin.dsl.getByType - -plugins { - id("com.android.application") -} - -val libs = extensions.getByType().named("libs") - -android { - namespace = "dev.ulfrx.recipe" - compileSdk = libs.findVersion("android-compileSdk").get().toString().toInt() - - defaultConfig { - applicationId = "dev.ulfrx.recipe" - minSdk = libs.findVersion("android-minSdk").get().toString().toInt() - targetSdk = libs.findVersion("android-targetSdk").get().toString().toInt() - versionCode = 1 - versionName = "1.0" - } - packaging { - resources { - excludes += "/META-INF/{AL2.0,LGPL2.1}" - } - } - buildTypes { - getByName("release") { - isMinifyEnabled = false - } - } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 - } -} diff --git a/build-logic/src/main/kotlin/recipe.compose.multiplatform.gradle.kts b/build-logic/src/main/kotlin/recipe.compose.multiplatform.gradle.kts deleted file mode 100644 index f8dd887..0000000 --- a/build-logic/src/main/kotlin/recipe.compose.multiplatform.gradle.kts +++ /dev/null @@ -1,27 +0,0 @@ -import org.gradle.api.artifacts.VersionCatalogsExtension -import org.gradle.kotlin.dsl.getByType - -plugins { - id("recipe.kotlin.multiplatform") - id("org.jetbrains.compose") - id("org.jetbrains.kotlin.plugin.compose") - id("org.jetbrains.compose.hot-reload") -} - -val libs = extensions.getByType().named("libs") - -kotlin { - sourceSets { - commonMain.dependencies { - implementation(libs.findLibrary("compose-runtime").get()) - implementation(libs.findLibrary("compose-foundation").get()) - implementation(libs.findLibrary("compose-material3").get()) - implementation(libs.findLibrary("compose-ui").get()) - implementation(libs.findLibrary("compose-components-resources").get()) - implementation(libs.findLibrary("androidx-lifecycle-viewmodelCompose").get()) - implementation(libs.findLibrary("androidx-lifecycle-runtimeCompose").get()) - implementation(libs.findLibrary("koin-compose").get()) - implementation(libs.findLibrary("koin-composeViewmodel").get()) - } - } -} diff --git a/build-logic/src/main/kotlin/recipe.jvm.server.gradle.kts b/build-logic/src/main/kotlin/recipe.jvm.server.gradle.kts deleted file mode 100644 index 61e0eaf..0000000 --- a/build-logic/src/main/kotlin/recipe.jvm.server.gradle.kts +++ /dev/null @@ -1,42 +0,0 @@ -import org.gradle.api.artifacts.VersionCatalogsExtension -import org.gradle.kotlin.dsl.getByType - -plugins { - id("org.jetbrains.kotlin.jvm") - id("org.jetbrains.kotlin.plugin.serialization") - id("io.ktor.plugin") - id("org.flywaydb.flyway") - application -} - -val libs = extensions.getByType().named("libs") - -kotlin { - jvmToolchain(21) - compilerOptions { - allWarningsAsErrors.set(true) - } -} - -dependencies { - "implementation"(libs.findLibrary("ktor-serverCore").get()) - "implementation"(libs.findLibrary("ktor-serverNetty").get()) - "implementation"(libs.findLibrary("ktor-serverContentNegotiation").get()) - "implementation"(libs.findLibrary("ktor-serializationKotlinxJson").get()) - "implementation"(libs.findLibrary("logback").get()) - "implementation"(libs.findLibrary("flyway-core").get()) - "implementation"(libs.findLibrary("flyway-database-postgresql").get()) - "implementation"(libs.findLibrary("postgresql").get()) - "testImplementation"(libs.findLibrary("ktor-serverTestHost").get()) - "testImplementation"(libs.findLibrary("kotlin-testJunit").get()) -} - -flyway { - url = System.getenv("DATABASE_URL") ?: "jdbc:postgresql://localhost:5432/recipe" - user = System.getenv("DATABASE_USER") ?: "recipe" - password = System.getenv("DATABASE_PASSWORD") ?: "recipe" - locations = arrayOf("classpath:db/migration") - cleanDisabled = true - baselineOnMigrate = true - validateOnMigrate = true -} diff --git a/build-logic/src/main/kotlin/recipe.kotlin.multiplatform.gradle.kts b/build-logic/src/main/kotlin/recipe.kotlin.multiplatform.gradle.kts index 340fe0d..ab7e442 100644 --- a/build-logic/src/main/kotlin/recipe.kotlin.multiplatform.gradle.kts +++ b/build-logic/src/main/kotlin/recipe.kotlin.multiplatform.gradle.kts @@ -1,6 +1,8 @@ -// build-logic/src/main/kotlin/recipe.kotlin.multiplatform.gradle.kts -// Establishes the D-05 target matrix + JVM toolchain + common deps. +// Establishes the D-05 target matrix + JVM toolchain + warning policy. // Android bytecode is JVM 11 (D-08); server + desktop + shared/jvm are JVM 21. +// +// This plugin is intentionally dependency-free: shared/ must stay light +// (no Koin, no Kermit), and composeApp adds those in its own build file. import org.gradle.api.artifacts.VersionCatalogsExtension import org.gradle.kotlin.dsl.getByType @@ -22,12 +24,8 @@ kotlin { } } - listOf(iosArm64(), iosSimulatorArm64()).forEach { iosTarget -> - iosTarget.binaries.framework { - baseName = "ComposeApp" - isStatic = true - } - } + iosArm64() + iosSimulatorArm64() jvm { compilerOptions { @@ -43,11 +41,6 @@ kotlin { } sourceSets { - commonMain.dependencies { - implementation(project.dependencies.platform(libs.findLibrary("koin-bom").get())) - implementation(libs.findLibrary("koin-core").get()) - implementation(libs.findLibrary("kermit").get()) - } commonTest.dependencies { implementation(libs.findLibrary("kotlin-test").get()) } diff --git a/composeApp/build.gradle.kts b/composeApp/build.gradle.kts index 6f333b4..d5bc908 100644 --- a/composeApp/build.gradle.kts +++ b/composeApp/build.gradle.kts @@ -1,24 +1,72 @@ plugins { - // AGP must apply BEFORE recipe.kotlin.multiplatform — the latter calls androidTarget(), - // which requires the Android Gradle Plugin to already be on the project. Gradle applies - // plugin IDs in declaration order, so recipe.android.application is listed first. - id("recipe.android.application") + // AGP must apply before recipe.kotlin.multiplatform — the latter calls androidTarget(), + // which requires the Android Gradle Plugin to already be on the project. + alias(libs.plugins.androidApplication) id("recipe.kotlin.multiplatform") - id("recipe.compose.multiplatform") + alias(libs.plugins.composeMultiplatform) + alias(libs.plugins.composeCompiler) + alias(libs.plugins.composeHotReload) id("recipe.quality") } +android { + namespace = "dev.ulfrx.recipe" + compileSdk = libs.versions.android.compileSdk.get().toInt() + + defaultConfig { + applicationId = "dev.ulfrx.recipe" + minSdk = libs.versions.android.minSdk.get().toInt() + targetSdk = libs.versions.android.targetSdk.get().toInt() + versionCode = 1 + versionName = "1.0" + } + packaging { + resources { + excludes += "/META-INF/{AL2.0,LGPL2.1}" + } + } + buildTypes { + getByName("release") { + isMinifyEnabled = false + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } +} + kotlin { + // Create the iOS framework Swift imports as `ComposeApp`. + listOf(iosArm64(), iosSimulatorArm64()).forEach { iosTarget -> + iosTarget.binaries.framework { + baseName = "ComposeApp" + isStatic = true + } + } + sourceSets { + commonMain.dependencies { + implementation(project.dependencies.platform(libs.koin.bom)) + implementation(libs.koin.core) + implementation(libs.koin.compose) + implementation(libs.koin.composeViewmodel) + implementation(libs.kermit) + implementation(libs.compose.runtime) + implementation(libs.compose.foundation) + implementation(libs.compose.material3) + implementation(libs.compose.ui) + implementation(libs.compose.components.resources) + implementation(libs.compose.uiToolingPreview) + implementation(libs.androidx.lifecycle.viewmodelCompose) + implementation(libs.androidx.lifecycle.runtimeCompose) + implementation(projects.shared) + } androidMain.dependencies { implementation(libs.compose.uiToolingPreview) implementation(libs.androidx.activity.compose) implementation(libs.koin.android) } - commonMain.dependencies { - implementation(libs.compose.uiToolingPreview) - implementation(projects.shared) - } jvmMain.dependencies { implementation(compose.desktop.currentOs) implementation(libs.kotlinx.coroutinesSwing) diff --git a/server/build.gradle.kts b/server/build.gradle.kts index 01c8d0c..bd093f9 100644 --- a/server/build.gradle.kts +++ b/server/build.gradle.kts @@ -1,11 +1,22 @@ plugins { - id("recipe.jvm.server") + alias(libs.plugins.kotlinJvm) + alias(libs.plugins.kotlinSerialization) + alias(libs.plugins.ktor) + alias(libs.plugins.flywayPlugin) + application id("recipe.quality") } group = "dev.ulfrx.recipe" version = "1.0.0" +kotlin { + jvmToolchain(21) + compilerOptions { + allWarningsAsErrors.set(true) + } +} + application { mainClass.set("dev.ulfrx.recipe.ApplicationKt") @@ -14,5 +25,25 @@ application { } dependencies { + implementation(libs.ktor.serverCore) + implementation(libs.ktor.serverNetty) + implementation(libs.ktor.serverContentNegotiation) + implementation(libs.ktor.serializationKotlinxJson) + implementation(libs.logback) + implementation(libs.flyway.core) + implementation(libs.flyway.database.postgresql) + implementation(libs.postgresql) implementation(projects.shared) + testImplementation(libs.ktor.serverTestHost) + testImplementation(libs.kotlin.testJunit) +} + +flyway { + url = System.getenv("DATABASE_URL") ?: "jdbc:postgresql://localhost:5432/recipe" + user = System.getenv("DATABASE_USER") ?: "recipe" + password = System.getenv("DATABASE_PASSWORD") ?: "recipe" + locations = arrayOf("classpath:db/migration") + cleanDisabled = true + baselineOnMigrate = true + validateOnMigrate = true } diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index 88161b8..1b4836e 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -1,7 +1,6 @@ plugins { // AGP must apply BEFORE recipe.kotlin.multiplatform — the latter calls androidTarget(), - // which requires the Android Gradle Plugin to already be on the project. Gradle applies - // plugin IDs in declaration order, so com.android.library is listed first. + // which requires the Android Gradle Plugin to already be on the project. alias(libs.plugins.androidLibrary) id("recipe.kotlin.multiplatform") id("recipe.quality") @@ -10,36 +9,26 @@ plugins { kotlin { explicitApi() - // Override framework baseName: shared exposes "Shared.framework" to Swift, while - // composeApp's convention-plugin default is "ComposeApp.framework". (D-07 / PITFALL #10) - targets.withType().configureEach { - binaries.withType().configureEach { - baseName = "Shared" - } - } + // No iOS framework here — composeApp's umbrella `ComposeApp.framework` + // transitively exports shared. Producing a second framework would double-bundle + // the Kotlin stdlib at link time (PITFALL: duplicate-framework collision). sourceSets { commonMain.dependencies { // Phase 1: intentionally empty. Domain models + DTOs land Phase 2+. - // D-19 / INFRA-06: Do NOT add Ktor, Compose, or SQLDelight deps here — EVER. + // D-19 / INFRA-06: No Ktor, Compose, SQLDelight, Koin, or Kermit here — EVER. } } } android { namespace = "dev.ulfrx.recipe.shared" - compileSdk = - libs.versions.android.compileSdk - .get() - .toInt() + compileSdk = libs.versions.android.compileSdk.get().toInt() compileOptions { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 } defaultConfig { - minSdk = - libs.versions.android.minSdk - .get() - .toInt() + minSdk = libs.versions.android.minSdk.get().toInt() } }