From d67d59013bc3f4a6238b992408dc284e22610f47 Mon Sep 17 00:00:00 2001 From: chanho0908 Date: Tue, 20 Jan 2026 01:18:39 +0900 Subject: [PATCH 01/12] =?UTF-8?q?feat:=20build-logic=20=EC=BB=A8=EB=B2=A4?= =?UTF-8?q?=EC=85=98=20=ED=94=8C=EB=9F=AC=EA=B7=B8=EC=9D=B8=20=EB=AA=A8?= =?UTF-8?q?=EB=93=88=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feature 모듈 분리를 위한 Gradle Convention Plugin 구조를 구축했습니다. - KMP, Android, Compose 설정을 중앙화하여 일관된 빌드 환경 제공 - 향후 feature 모듈 생성 시 반복적인 설정 작업 최소화 🤖 Generated with [Firebender](https://firebender.com) Co-Authored-By: Firebender --- build-logic/README.md | 98 +++++++++++++++++++ build-logic/convention/build.gradle.kts | 41 ++++++++ .../app/AndroidLibraryConventionPlugin.kt | 37 +++++++ .../ComposeMultiplatformConventionPlugin.kt | 39 ++++++++ .../KotlinMultiplatformConventionPlugin.kt | 53 ++++++++++ build-logic/settings.gradle.kts | 16 +++ settings.gradle.kts | 1 + 7 files changed, 285 insertions(+) create mode 100644 build-logic/README.md create mode 100644 build-logic/convention/build.gradle.kts create mode 100644 build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/AndroidLibraryConventionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/ComposeMultiplatformConventionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/KotlinMultiplatformConventionPlugin.kt create mode 100644 build-logic/settings.gradle.kts diff --git a/build-logic/README.md b/build-logic/README.md new file mode 100644 index 0000000..ef97cbc --- /dev/null +++ b/build-logic/README.md @@ -0,0 +1,98 @@ +# Build Logic + +DroidMorning 프로젝트의 Gradle Convention Plugin 모듈입니다. +각 모듈의 빌드 설정을 중앙화하고 일관성있게 관리합니다. + +## 📦 제공하는 Convention Plugins + +### 1. `droidmorning.kotlin.multiplatform` +Kotlin Multiplatform 공통 설정을 제공합니다. + +**적용 방법:** +```kotlin +plugins { + id("droidmorning.kotlin.multiplatform") +} +``` + +**포함 설정:** +- Android target (JVM 17) +- iOS targets (iosX64, iosArm64, iosSimulatorArm64) +- 기본 소스셋 계층 구조 +- 공통 테스트 의존성 + +### 2. `droidmorning.android.library` +Android Library 공통 설정을 제공합니다. + +**적용 방법:** +```kotlin +plugins { + id("droidmorning.android.library") +} +``` + +**포함 설정:** +- compileSdk: 35 +- minSdk: 26 +- Java 17 호환성 +- BuildConfig 활성화 + +### 3. `droidmorning.compose.multiplatform` +Compose Multiplatform 공통 설정을 제공합니다. + +**적용 방법:** +```kotlin +plugins { + id("droidmorning.kotlin.multiplatform") + id("droidmorning.compose.multiplatform") +} +``` + +**포함 설정:** +- Compose Multiplatform 플러그인 +- Compose Compiler 플러그인 +- 기본 Compose 의존성 (runtime, foundation, material3, ui 등) + +## 🚀 사용 예시 + +### Feature 모듈 생성 시 +```kotlin +// feature/home/build.gradle.kts +plugins { + id("droidmorning.kotlin.multiplatform") + id("droidmorning.android.library") + id("droidmorning.compose.multiplatform") +} + +kotlin { + sourceSets { + commonMain.dependencies { + implementation(projects.domain) + implementation(projects.designsystem) + // 추가 의존성... + } + } +} +``` + +## 📁 디렉토리 구조 + +``` +build-logic/ +├── convention/ +│ ├── build.gradle.kts +│ └── src/main/kotlin/com/peto/droidmorning/app/ +│ ├── AndroidLibraryConventionPlugin.kt +│ ├── KotlinMultiplatformConventionPlugin.kt +│ └── ComposeMultiplatformConventionPlugin.kt +└── settings.gradle.kts +``` + +## 🔧 수정 방법 + +Convention Plugin을 수정한 후에는 Gradle sync를 실행하여 변경사항을 적용해야 합니다: + +```bash +./gradlew --stop +./gradlew tasks +``` diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts new file mode 100644 index 0000000..3159c33 --- /dev/null +++ b/build-logic/convention/build.gradle.kts @@ -0,0 +1,41 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + +plugins { + `kotlin-dsl` +} + +group = "com.peto.droidmorning.buildlogic" + +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +kotlin { + compilerOptions { + jvmTarget = JvmTarget.JVM_17 + } +} + +dependencies { + compileOnly(libs.android.gradle.plugin) + compileOnly(libs.kotlin.gradle.plugin) + compileOnly(libs.compose.gradle.plugin) +} + +gradlePlugin { + plugins { + register("androidLibrary") { + id = "droidmorning.android.library" + implementationClass = "com.peto.droidmorning.app.AndroidLibraryConventionPlugin" + } + register("kotlinMultiplatform") { + id = "droidmorning.kotlin.multiplatform" + implementationClass = "com.peto.droidmorning.app.KotlinMultiplatformConventionPlugin" + } + register("composeMultiplatform") { + id = "droidmorning.compose.multiplatform" + implementationClass = "com.peto.droidmorning.app.ComposeMultiplatformConventionPlugin" + } + } +} diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/AndroidLibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/AndroidLibraryConventionPlugin.kt new file mode 100644 index 0000000..c69f46d --- /dev/null +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/AndroidLibraryConventionPlugin.kt @@ -0,0 +1,37 @@ +package com.peto.droidmorning.app + +import com.android.build.gradle.LibraryExtension +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure + +/** + * Android Library 컨벤션 플러그인 + * 공통 Android 라이브러리 설정을 중앙화합니다. + */ +class AndroidLibraryConventionPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + with(pluginManager) { + apply("com.android.library") + } + + extensions.configure { + compileSdk = 35 + + defaultConfig { + minSdk = 26 + } + + compileOptions { + sourceCompatibility = org.gradle.api.JavaVersion.VERSION_17 + targetCompatibility = org.gradle.api.JavaVersion.VERSION_17 + } + + buildFeatures { + buildConfig = true + } + } + } + } +} diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/ComposeMultiplatformConventionPlugin.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/ComposeMultiplatformConventionPlugin.kt new file mode 100644 index 0000000..43e2d0a --- /dev/null +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/ComposeMultiplatformConventionPlugin.kt @@ -0,0 +1,39 @@ +package com.peto.droidmorning.app + +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure +import org.jetbrains.compose.ComposeExtension +import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension + +/** + * Compose Multiplatform 컨벤션 플러그인 + * 공통 Compose Multiplatform 설정을 중앙화합니다. + */ +class ComposeMultiplatformConventionPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + with(pluginManager) { + apply("org.jetbrains.compose") + apply("org.jetbrains.kotlin.plugin.compose") + } + + extensions.configure { + sourceSets.apply { + commonMain.dependencies { + implementation(compose.runtime) + implementation(compose.foundation) + implementation(compose.material3) + implementation(compose.ui) + implementation(compose.components.resources) + implementation(compose.components.uiToolingPreview) + } + + androidMain.dependencies { + implementation(compose.preview) + } + } + } + } + } +} diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/KotlinMultiplatformConventionPlugin.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/KotlinMultiplatformConventionPlugin.kt new file mode 100644 index 0000000..7e2c094 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/KotlinMultiplatformConventionPlugin.kt @@ -0,0 +1,53 @@ +package com.peto.droidmorning.app + +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure +import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension + +/** + * Kotlin Multiplatform 컨벤션 플러그인 + * 공통 KMP 설정을 중앙화합니다. + */ +class KotlinMultiplatformConventionPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + with(pluginManager) { + apply("org.jetbrains.kotlin.multiplatform") + } + + extensions.configure { + applyDefaultHierarchyTemplate() + + androidTarget { + compilations.all { + kotlinOptions { + jvmTarget = "17" + } + } + } + + listOf( + iosX64(), + iosArm64(), + iosSimulatorArm64(), + ).forEach { iosTarget -> + iosTarget.binaries.framework { + baseName = project.name + isStatic = true + } + } + + sourceSets.apply { + commonMain.dependencies { + // 공통 의존성을 여기에 추가할 수 있습니다 + } + + commonTest.dependencies { + implementation(kotlin("test")) + } + } + } + } + } +} diff --git a/build-logic/settings.gradle.kts b/build-logic/settings.gradle.kts new file mode 100644 index 0000000..2bbf977 --- /dev/null +++ b/build-logic/settings.gradle.kts @@ -0,0 +1,16 @@ +dependencyResolutionManagement { + repositories { + google() + mavenCentral() + gradlePluginPortal() + } + versionCatalogs { + create("libs") { + from(files("../gradle/libs.versions.toml")) + } + } +} + +rootProject.name = "build-logic" + +include(":convention") diff --git a/settings.gradle.kts b/settings.gradle.kts index 23f4b35..1522ace 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -2,6 +2,7 @@ rootProject.name = "DroidMorning" enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") pluginManagement { + includeBuild("build-logic") repositories { google { mavenContent { From 1fe1a81ddc79afef709a165de1975f8a21ac602d Mon Sep 17 00:00:00 2001 From: chanho0908 Date: Tue, 20 Jan 2026 01:25:19 +0900 Subject: [PATCH 02/12] =?UTF-8?q?refactor:=20build-logic=20primitive=20?= =?UTF-8?q?=ED=94=8C=EB=9F=AC=EA=B7=B8=EC=9D=B8=20=EA=B5=AC=EC=A1=B0=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DroidKnights 프로젝트 구조를 참조하여 build-logic을 개선했습니다. - primitive 패키지로 세분화된 플러그인 구조 구현 - Extension 유틸리티 함수로 깔끔한 코드 작성 - Feature 모듈용 통합 플러그인(droidmorning.feature) 추가 - Compose 의존성을 함수로 분리하여 재사용성 향상 🤖 Generated with [Firebender](https://firebender.com) Co-Authored-By: Firebender --- build-logic/README.md | 150 +++++++++++++++--- build-logic/convention/build.gradle.kts | 16 ++ .../app/AndroidLibraryConventionPlugin.kt | 5 +- .../ComposeMultiplatformConventionPlugin.kt | 33 +--- .../app/DroidMorningFeaturePlugin.kt | 46 ++++++ .../com/peto/droidmorning/app/Extensions.kt | 53 +++++++ .../KotlinMultiplatformConventionPlugin.kt | 51 ++---- .../app/primitive/ComposeExtensions.kt | 44 +++++ .../KotlinMultiPlatformAndroidPlugin.kt | 55 +++++++ .../primitive/KotlinMultiPlatformPlugin.kt | 38 +++++ .../primitive/KotlinMultiPlatformiOSPlugin.kt | 30 ++++ 11 files changed, 433 insertions(+), 88 deletions(-) create mode 100644 build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/DroidMorningFeaturePlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/Extensions.kt create mode 100644 build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/ComposeExtensions.kt create mode 100644 build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/KotlinMultiPlatformAndroidPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/KotlinMultiPlatformPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/KotlinMultiPlatformiOSPlugin.kt diff --git a/build-logic/README.md b/build-logic/README.md index ef97cbc..f7f0b90 100644 --- a/build-logic/README.md +++ b/build-logic/README.md @@ -5,7 +5,48 @@ DroidMorning 프로젝트의 Gradle Convention Plugin 모듈입니다. ## 📦 제공하는 Convention Plugins -### 1. `droidmorning.kotlin.multiplatform` +### 🎯 High-Level Plugins (권장) + +#### 1. `droidmorning.feature` ⭐ +Feature 모듈을 위한 통합 플러그인입니다. 한 번에 모든 설정을 적용합니다. + +**적용 방법:** +```kotlin +plugins { + id("droidmorning.feature") +} +``` + +**포함 설정:** +- Kotlin Multiplatform (Android + iOS) +- Compose Multiplatform +- 기본 의존성 (domain, designsystem, navigation, lifecycle, koin) + +**사용 예시:** +```kotlin +// feature/home/build.gradle.kts +plugins { + id("droidmorning.feature") +} + +kotlin { + sourceSets { + commonMain.dependencies { + // feature 플러그인이 자동으로 추가하는 의존성: + // - project(":domain") + // - project(":designsystem") + // - androidx-navigation-compose + // - androidx-lifecycle-runtime-compose + // - koin-compose-viewmodel + + // 추가 의존성만 여기에 작성 + implementation(libs.ktor.client.core) + } + } +} +``` + +#### 2. `droidmorning.kotlin.multiplatform` Kotlin Multiplatform 공통 설정을 제공합니다. **적용 방법:** @@ -19,9 +60,24 @@ plugins { - Android target (JVM 17) - iOS targets (iosX64, iosArm64, iosSimulatorArm64) - 기본 소스셋 계층 구조 -- 공통 테스트 의존성 -### 2. `droidmorning.android.library` +#### 3. `droidmorning.compose.multiplatform` +Compose Multiplatform 공통 설정을 제공합니다. + +**적용 방법:** +```kotlin +plugins { + id("droidmorning.kotlin.multiplatform") + id("droidmorning.compose.multiplatform") +} +``` + +**포함 설정:** +- Compose Multiplatform 플러그인 +- Compose Compiler 플러그인 +- 기본 Compose 의존성 (runtime, foundation, material3, ui, resources 등) + +#### 4. `droidmorning.android.library` Android Library 공통 설정을 제공합니다. **적용 방법:** @@ -37,27 +93,54 @@ plugins { - Java 17 호환성 - BuildConfig 활성화 -### 3. `droidmorning.compose.multiplatform` -Compose Multiplatform 공통 설정을 제공합니다. +### 🔧 Primitive Plugins (고급) -**적용 방법:** +세밀한 제어가 필요한 경우 사용하는 저수준 플러그인들입니다. + +- `droidmorning.kmp` - 기본 Kotlin Multiplatform 설정 +- `droidmorning.kmp.android` - Android 타겟 설정 +- `droidmorning.kmp.ios` - iOS 타겟 설정 + +## 🚀 사용 예시 + +### Feature 모듈 생성 (권장) ```kotlin +// feature/home/build.gradle.kts plugins { - id("droidmorning.kotlin.multiplatform") - id("droidmorning.compose.multiplatform") + id("droidmorning.feature") +} + +// 기본 설정이 모두 포함되어 있으므로 추가 의존성만 작성 +kotlin { + sourceSets { + commonMain.dependencies { + implementation(libs.kotlinx.datetime) + } + } } ``` -**포함 설정:** -- Compose Multiplatform 플러그인 -- Compose Compiler 플러그인 -- 기본 Compose 의존성 (runtime, foundation, material3, ui 등) +### Core 모듈 생성 +```kotlin +// core/network/build.gradle.kts +plugins { + id("droidmorning.kotlin.multiplatform") + id("droidmorning.android.library") +} -## 🚀 사용 예시 +kotlin { + sourceSets { + commonMain.dependencies { + implementation(libs.ktor.client.core) + implementation(libs.kotlinx.serialization.json) + } + } +} +``` -### Feature 모듈 생성 시 +### UI 모듈 생성 ```kotlin -// feature/home/build.gradle.kts +// core/ui/build.gradle.kts plugins { id("droidmorning.kotlin.multiplatform") id("droidmorning.android.library") @@ -67,9 +150,7 @@ plugins { kotlin { sourceSets { commonMain.dependencies { - implementation(projects.domain) implementation(projects.designsystem) - // 추가 의존성... } } } @@ -82,12 +163,35 @@ build-logic/ ├── convention/ │ ├── build.gradle.kts │ └── src/main/kotlin/com/peto/droidmorning/app/ -│ ├── AndroidLibraryConventionPlugin.kt -│ ├── KotlinMultiplatformConventionPlugin.kt -│ └── ComposeMultiplatformConventionPlugin.kt +│ ├── Extensions.kt # 유틸리티 확장 함수 +│ ├── AndroidLibraryConventionPlugin.kt # Android Library 플러그인 +│ ├── KotlinMultiplatformConventionPlugin.kt # KMP 컨벤션 플러그인 +│ ├── ComposeMultiplatformConventionPlugin.kt # Compose 컨벤션 플러그인 +│ ├── DroidMorningFeaturePlugin.kt # Feature 통합 플러그인 +│ └── primitive/ +│ ├── ComposeExtensions.kt # Compose 확장 함수 +│ ├── KotlinMultiPlatformPlugin.kt # 기본 KMP 플러그인 +│ ├── KotlinMultiPlatformAndroidPlugin.kt # Android 타겟 플러그인 +│ └── KotlinMultiPlatformiOSPlugin.kt # iOS 타겟 플러그인 └── settings.gradle.kts ``` +## 🎨 아키텍처 + +``` +High-Level Plugins +├─ droidmorning.feature (모든 것 포함) +│ └─ 내부적으로 primitive 플러그인들 조합 +│ +├─ droidmorning.kotlin.multiplatform +│ ├─ droidmorning.kmp +│ ├─ droidmorning.kmp.android +│ └─ droidmorning.kmp.ios +│ +└─ droidmorning.compose.multiplatform + └─ Compose 의존성 자동 설정 +``` + ## 🔧 수정 방법 Convention Plugin을 수정한 후에는 Gradle sync를 실행하여 변경사항을 적용해야 합니다: @@ -96,3 +200,9 @@ Convention Plugin을 수정한 후에는 Gradle sync를 실행하여 변경사 ./gradlew --stop ./gradlew tasks ``` + +## 💡 팁 + +1. **Feature 모듈을 만들 때는 `droidmorning.feature`만 사용하세요** - 가장 간단하고 빠릅니다. +2. **Core 모듈은 필요한 플러그인만 선택적으로 적용하세요** - 불필요한 의존성을 피할 수 있습니다. +3. **Primitive 플러그인은 특별한 경우가 아니면 직접 사용하지 마세요** - High-level 플러그인이 더 편리합니다. diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index 3159c33..147d486 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -25,6 +25,18 @@ dependencies { gradlePlugin { plugins { + register("kmpPrimitive") { + id = "droidmorning.kmp" + implementationClass = "com.peto.droidmorning.app.primitive.KotlinMultiPlatformPlugin" + } + register("kmpAndroid") { + id = "droidmorning.kmp.android" + implementationClass = "com.peto.droidmorning.app.primitive.KotlinMultiPlatformAndroidPlugin" + } + register("kmpIos") { + id = "droidmorning.kmp.ios" + implementationClass = "com.peto.droidmorning.app.primitive.KotlinMultiPlatformiOSPlugin" + } register("androidLibrary") { id = "droidmorning.android.library" implementationClass = "com.peto.droidmorning.app.AndroidLibraryConventionPlugin" @@ -37,5 +49,9 @@ gradlePlugin { id = "droidmorning.compose.multiplatform" implementationClass = "com.peto.droidmorning.app.ComposeMultiplatformConventionPlugin" } + register("droidmorningFeature") { + id = "droidmorning.feature" + implementationClass = "com.peto.droidmorning.app.DroidMorningFeaturePlugin" + } } } diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/AndroidLibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/AndroidLibraryConventionPlugin.kt index c69f46d..b4d3593 100644 --- a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/AndroidLibraryConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/AndroidLibraryConventionPlugin.kt @@ -1,6 +1,7 @@ package com.peto.droidmorning.app import com.android.build.gradle.LibraryExtension +import org.gradle.api.JavaVersion import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.kotlin.dsl.configure @@ -24,8 +25,8 @@ class AndroidLibraryConventionPlugin : Plugin { } compileOptions { - sourceCompatibility = org.gradle.api.JavaVersion.VERSION_17 - targetCompatibility = org.gradle.api.JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } buildFeatures { diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/ComposeMultiplatformConventionPlugin.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/ComposeMultiplatformConventionPlugin.kt index 43e2d0a..f31e077 100644 --- a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/ComposeMultiplatformConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/ComposeMultiplatformConventionPlugin.kt @@ -1,39 +1,20 @@ package com.peto.droidmorning.app +import com.peto.droidmorning.app.primitive.composeMultiplatformDependencies import org.gradle.api.Plugin import org.gradle.api.Project -import org.gradle.kotlin.dsl.configure -import org.jetbrains.compose.ComposeExtension -import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension /** * Compose Multiplatform 컨벤션 플러그인 * 공통 Compose Multiplatform 설정을 중앙화합니다. */ class ComposeMultiplatformConventionPlugin : Plugin { - override fun apply(target: Project) { - with(target) { - with(pluginManager) { - apply("org.jetbrains.compose") - apply("org.jetbrains.kotlin.plugin.compose") - } - - extensions.configure { - sourceSets.apply { - commonMain.dependencies { - implementation(compose.runtime) - implementation(compose.foundation) - implementation(compose.material3) - implementation(compose.ui) - implementation(compose.components.resources) - implementation(compose.components.uiToolingPreview) - } - - androidMain.dependencies { - implementation(compose.preview) - } - } - } + override fun apply(target: Project) = with(target) { + with(pluginManager) { + apply(libs.findPlugin("compose-multiplatform").get().get().pluginId) + apply(libs.findPlugin("kotlin-compose").get().get().pluginId) } + + composeMultiplatformDependencies() } } diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/DroidMorningFeaturePlugin.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/DroidMorningFeaturePlugin.kt new file mode 100644 index 0000000..f1a33a7 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/DroidMorningFeaturePlugin.kt @@ -0,0 +1,46 @@ +package com.peto.droidmorning.app + +import com.peto.droidmorning.app.primitive.KotlinMultiPlatformAndroidPlugin +import com.peto.droidmorning.app.primitive.KotlinMultiPlatformPlugin +import com.peto.droidmorning.app.primitive.KotlinMultiPlatformiOSPlugin +import com.peto.droidmorning.app.primitive.composeMultiplatformDependencies +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.apply +import org.gradle.kotlin.dsl.configure +import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension + +/** + * DroidMorning Feature 모듈 통합 플러그인 + * Feature 모듈에 필요한 모든 설정을 한번에 적용합니다. + */ +class DroidMorningFeaturePlugin : Plugin { + override fun apply(target: Project) = with(target) { + with(pluginManager) { + apply(libs.findPlugin("android-library").get().get().pluginId) + apply(libs.findPlugin("kotlin-multiplatform").get().get().pluginId) + apply(libs.findPlugin("compose-multiplatform").get().get().pluginId) + apply(libs.findPlugin("kotlin-compose").get().get().pluginId) + } + + apply() + apply() + apply() + + composeMultiplatformDependencies() + + extensions.configure { + sourceSets.apply { + commonMain { + dependencies { + implementation(project(":domain")) + implementation(project(":designsystem")) + implementation(libs.library("androidx-navigation-compose")) + implementation(libs.library("androidx-lifecycle-runtime-compose")) + implementation(libs.library("koin-compose-viewmodel")) + } + } + } + } + } +} diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/Extensions.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/Extensions.kt new file mode 100644 index 0000000..91386c5 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/Extensions.kt @@ -0,0 +1,53 @@ +package com.peto.droidmorning.app + +import com.android.build.api.dsl.ApplicationExtension +import com.android.build.api.dsl.CommonExtension +import com.android.build.api.dsl.LibraryExtension +import org.gradle.api.Project +import org.gradle.api.artifacts.ExternalModuleDependencyBundle +import org.gradle.api.artifacts.MinimalExternalModuleDependency +import org.gradle.api.artifacts.VersionCatalog +import org.gradle.api.artifacts.VersionCatalogsExtension +import org.gradle.api.plugins.ExtensionContainer +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.getByType +import org.gradle.plugin.use.PluginDependency +import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension + +internal val ExtensionContainer.libs: VersionCatalog + get() = getByType().named("libs") + +internal val Project.libs: VersionCatalog + get() = extensions.getByType().named("libs") + +internal val Project.applicationExtension: CommonExtension<*, *, *, *, *, *> + get() = extensions.getByType() + +internal val Project.libraryExtension: CommonExtension<*, *, *, *, *, *> + get() = extensions.getByType() + +internal val Project.androidExtension: CommonExtension<*, *, *, *, *, *> + get() = runCatching { libraryExtension } + .recoverCatching { applicationExtension } + .onFailure { println("Could not find Library or Application extension from this project") } + .getOrThrow() + +internal fun VersionCatalog.version(name: String): String { + return findVersion(name).get().requiredVersion +} + +internal fun VersionCatalog.library(name: String): MinimalExternalModuleDependency { + return findLibrary(name).get().get() +} + +internal fun VersionCatalog.plugin(name: String): PluginDependency { + return findPlugin(name).get().get() +} + +internal fun VersionCatalog.bundle(name: String): ExternalModuleDependencyBundle { + return findBundle(name).get().get() +} + +internal fun Project.kotlin(action: KotlinMultiplatformExtension.() -> Unit) { + extensions.configure(action) +} diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/KotlinMultiplatformConventionPlugin.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/KotlinMultiplatformConventionPlugin.kt index 7e2c094..f9cf8f1 100644 --- a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/KotlinMultiplatformConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/KotlinMultiplatformConventionPlugin.kt @@ -1,53 +1,24 @@ package com.peto.droidmorning.app +import com.peto.droidmorning.app.primitive.KotlinMultiPlatformAndroidPlugin +import com.peto.droidmorning.app.primitive.KotlinMultiPlatformPlugin +import com.peto.droidmorning.app.primitive.KotlinMultiPlatformiOSPlugin import org.gradle.api.Plugin import org.gradle.api.Project -import org.gradle.kotlin.dsl.configure -import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension +import org.gradle.kotlin.dsl.apply /** * Kotlin Multiplatform 컨벤션 플러그인 * 공통 KMP 설정을 중앙화합니다. */ class KotlinMultiplatformConventionPlugin : Plugin { - override fun apply(target: Project) { - with(target) { - with(pluginManager) { - apply("org.jetbrains.kotlin.multiplatform") - } - - extensions.configure { - applyDefaultHierarchyTemplate() - - androidTarget { - compilations.all { - kotlinOptions { - jvmTarget = "17" - } - } - } - - listOf( - iosX64(), - iosArm64(), - iosSimulatorArm64(), - ).forEach { iosTarget -> - iosTarget.binaries.framework { - baseName = project.name - isStatic = true - } - } - - sourceSets.apply { - commonMain.dependencies { - // 공통 의존성을 여기에 추가할 수 있습니다 - } - - commonTest.dependencies { - implementation(kotlin("test")) - } - } - } + override fun apply(target: Project) = with(target) { + with(pluginManager) { + apply(libs.findPlugin("kotlin-multiplatform").get().get().pluginId) } + + apply() + apply() + apply() } } diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/ComposeExtensions.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/ComposeExtensions.kt new file mode 100644 index 0000000..11a5e01 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/ComposeExtensions.kt @@ -0,0 +1,44 @@ +package com.peto.droidmorning.app.primitive + +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.dependencies +import org.gradle.kotlin.dsl.getByType +import org.jetbrains.compose.ComposeExtension +import org.jetbrains.compose.resources.ResourcesExtension +import org.jetbrains.kotlin.compose.compiler.gradle.ComposeCompilerGradlePluginExtension +import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension + +fun Project.composeCompiler(block: ComposeCompilerGradlePluginExtension.() -> Unit) { + extensions.configure(block) +} + +val Project.compose: ComposeExtension + get() = extensions.getByType() + +fun ComposeExtension.resources(block: ResourcesExtension.() -> Unit) { + extensions.configure(block) +} + +internal fun Project.composeMultiplatformDependencies() { + val composeDependencies = extensions.getByType().dependencies + extensions.configure { + sourceSets.apply { + commonMain { + dependencies { + implementation(composeDependencies.runtime) + implementation(composeDependencies.foundation) + implementation(composeDependencies.material3) + implementation(composeDependencies.ui) + implementation(composeDependencies.components.resources) + implementation(composeDependencies.components.uiToolingPreview) + } + } + } + } + + dependencies { + "debugImplementation"(composeDependencies.uiTooling) + "debugImplementation"(composeDependencies.preview) + } +} diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/KotlinMultiPlatformAndroidPlugin.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/KotlinMultiPlatformAndroidPlugin.kt new file mode 100644 index 0000000..06ec441 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/KotlinMultiPlatformAndroidPlugin.kt @@ -0,0 +1,55 @@ +package com.peto.droidmorning.app.primitive + +import com.peto.droidmorning.app.androidExtension +import com.peto.droidmorning.app.libs +import org.gradle.api.JavaVersion +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure +import org.jetbrains.kotlin.gradle.dsl.JvmTarget +import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension + +/** + * Android 타겟 설정 플러그인 + */ +class KotlinMultiPlatformAndroidPlugin : Plugin { + override fun apply(target: Project): Unit = with(target) { + androidExtension.apply { + compileSdk = libs.findVersion("compileSdk").get().requiredVersion.toInt() + + extensions.configure { + androidTarget { + compilerOptions.jvmTarget.set(JvmTarget.JVM_17) + } + } + + defaultConfig { + minSdk = libs.findVersion("minSdk").get().requiredVersion.toInt() + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + packaging { + resources { + excludes += "/META-INF/{AL2.0,LGPL2.1}" + } + } + + sourceSets { + getByName("main") { + assets.srcDirs("src/androidMain/assets") + java.srcDirs("src/androidMain/kotlin") + res.srcDirs("src/androidMain/res") + } + getByName("test") { + assets.srcDirs("src/androidUnitTest/assets") + java.srcDirs("src/androidUnitTest/kotlin") + res.srcDirs("src/androidUnitTest/res") + } + } + } + } +} diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/KotlinMultiPlatformPlugin.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/KotlinMultiPlatformPlugin.kt new file mode 100644 index 0000000..513e888 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/KotlinMultiPlatformPlugin.kt @@ -0,0 +1,38 @@ +package com.peto.droidmorning.app.primitive + +import com.peto.droidmorning.app.libs +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.withType +import org.jetbrains.kotlin.gradle.dsl.JvmTarget +import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension + +/** + * 기본 Kotlin Multiplatform 설정 플러그인 + */ +class KotlinMultiPlatformPlugin : Plugin { + override fun apply(target: Project) = with(target) { + with(pluginManager) { + apply(libs.findPlugin("kotlin-multiplatform").get().get().pluginId) + } + + extensions.configure { + tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile::class.java) { + compilerOptions { + jvmTarget.set(JvmTarget.JVM_17) + } + } + + compilerOptions { + freeCompilerArgs.add("-Xexpect-actual-classes") + } + + applyDefaultHierarchyTemplate() + + tasks.withType().configureEach { + notCompatibleWithConfigurationCache("Configuration cache not supported for a system property read at configuration time") + } + } + } +} diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/KotlinMultiPlatformiOSPlugin.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/KotlinMultiPlatformiOSPlugin.kt new file mode 100644 index 0000000..73ee31a --- /dev/null +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/KotlinMultiPlatformiOSPlugin.kt @@ -0,0 +1,30 @@ +package com.peto.droidmorning.app.primitive + +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.get +import org.gradle.kotlin.dsl.withType +import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget + +/** + * iOS 타겟 설정 플러그인 + */ +class KotlinMultiPlatformiOSPlugin : Plugin { + override fun apply(target: Project) = with(target) { + extensions.configure { + iosArm64() + iosX64() + iosSimulatorArm64() + + targets.withType { + compilations["main"].kotlinOptions.freeCompilerArgs += "-Xexport-kdoc" + binaries.framework { + baseName = project.name + isStatic = true + } + } + } + } +} From 14c3295099c669acf3cc274a3540455d937019c0 Mon Sep 17 00:00:00 2001 From: chanho0908 Date: Tue, 20 Jan 2026 01:34:01 +0900 Subject: [PATCH 03/12] =?UTF-8?q?fix:=20ComposeExtension=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EB=B0=8F=20deprecated=20=EA=B2=BD=EA=B3=A0=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit libs.versions.toml의 Gradle 플러그인 설정을 수정했습니다. - compose-gradle-plugin을 정확한 artifact로 변경 (org.jetbrains.compose:compose-gradle-plugin) - compose-compiler-gradle-plugin 별도 추가 - freeCompilerArgs를 compilerOptions DSL로 마이그레이션 🤖 Generated with [Firebender](https://firebender.com) Co-Authored-By: Firebender --- build-logic/convention/build.gradle.kts | 1 + .../app/primitive/KotlinMultiPlatformiOSPlugin.kt | 4 +++- gradle/libs.versions.toml | 3 ++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index 147d486..cdf7563 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -21,6 +21,7 @@ dependencies { compileOnly(libs.android.gradle.plugin) compileOnly(libs.kotlin.gradle.plugin) compileOnly(libs.compose.gradle.plugin) + compileOnly(libs.compose.compiler.gradle.plugin) } gradlePlugin { diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/KotlinMultiPlatformiOSPlugin.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/KotlinMultiPlatformiOSPlugin.kt index 73ee31a..e7ef671 100644 --- a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/KotlinMultiPlatformiOSPlugin.kt +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/KotlinMultiPlatformiOSPlugin.kt @@ -19,7 +19,9 @@ class KotlinMultiPlatformiOSPlugin : Plugin { iosSimulatorArm64() targets.withType { - compilations["main"].kotlinOptions.freeCompilerArgs += "-Xexport-kdoc" + compilations["main"].compilerOptions.configure { + freeCompilerArgs.add("-Xexport-kdoc") + } binaries.framework { baseName = project.name isStatic = true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e2b5a0d..abf011f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -64,7 +64,8 @@ androidx-espresso = "3.7.0" # Gradle Plugins android-gradle-plugin = { group = "com.android.tools.build", name = "gradle", version.ref = "agp" } kotlin-gradle-plugin = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin", version.ref = "kotlin" } -compose-gradle-plugin = { module = "org.jetbrains.kotlin:compose-compiler-gradle-plugin", version.ref = "kotlin" } +compose-gradle-plugin = { group = "org.jetbrains.compose", name = "compose-gradle-plugin", version.ref = "compose-multiplatform" } +compose-compiler-gradle-plugin = { group = "org.jetbrains.kotlin", name = "compose-compiler-gradle-plugin", version.ref = "kotlin" } # AndroidX androidx-core-ktx = { module = "androidx.core:core-ktx", version.ref = "androidx-core-ktx" } From 36823076ed23198b9151053cab096e840b5f30e3 Mon Sep 17 00:00:00 2001 From: chanho0908 Date: Tue, 20 Jan 2026 01:42:01 +0900 Subject: [PATCH 04/12] =?UTF-8?q?fix:=20Compose=20deprecated=20API=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit composeDependencies.uiTooling과 composeDependencies.preview가 deprecated되어 직접 모듈 참조로 변경했습니다. - org.jetbrains.compose.ui:ui-tooling 직접 사용 - preview는 ui-tooling에 포함되어 제거 🤖 Generated with [Firebender](https://firebender.com) Co-Authored-By: Firebender --- .../com/peto/droidmorning/app/primitive/ComposeExtensions.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/ComposeExtensions.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/ComposeExtensions.kt index 11a5e01..602c36e 100644 --- a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/ComposeExtensions.kt +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/ComposeExtensions.kt @@ -38,7 +38,6 @@ internal fun Project.composeMultiplatformDependencies() { } dependencies { - "debugImplementation"(composeDependencies.uiTooling) - "debugImplementation"(composeDependencies.preview) + "debugImplementation"("org.jetbrains.compose.ui:ui-tooling:1.10.0") } } From 5c5d553cec05265e732767fa910d06fe7a7d3da3 Mon Sep 17 00:00:00 2001 From: chanho0908 Date: Tue, 20 Jan 2026 01:47:34 +0900 Subject: [PATCH 05/12] =?UTF-8?q?refactor:=20DroidMorningFeaturePlugin=20?= =?UTF-8?q?=EA=B0=9C=EC=84=A0=20=EB=B0=8F=20JVM=20=EB=B2=84=EC=A0=84=20?= =?UTF-8?q?=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기존 프로젝트 모듈들을 분석하여 Feature 플러그인을 개선했습니다. **주요 변경사항:** - JVM 타겟을 17에서 11로 변경 (프로젝트 표준) - compileSdk 35 → 36, minSdk 26 → 24 통일 - kotlin-serialization 플러그인 추가 - Koin 의존성을 bundle로 변경 (core, compose, compose-viewmodel) - Kotlinx 핵심 라이브러리 추가 (coroutines, serialization, datetime) - lifecycle-viewmodel-compose 추가 - commonTest 의존성 설정 추가 (kotlin-test, koin-test, coroutines-test) 🤖 Generated with [Firebender](https://firebender.com) Co-Authored-By: Firebender --- build-logic/README.md | 22 ++++++++++++------- build-logic/convention/build.gradle.kts | 6 ++--- .../app/AndroidLibraryConventionPlugin.kt | 8 +++---- .../app/DroidMorningFeaturePlugin.kt | 20 ++++++++++++++++- .../KotlinMultiPlatformAndroidPlugin.kt | 6 ++--- .../primitive/KotlinMultiPlatformPlugin.kt | 2 +- 6 files changed, 44 insertions(+), 20 deletions(-) diff --git a/build-logic/README.md b/build-logic/README.md index f7f0b90..22a2af4 100644 --- a/build-logic/README.md +++ b/build-logic/README.md @@ -18,9 +18,16 @@ plugins { ``` **포함 설정:** -- Kotlin Multiplatform (Android + iOS) -- Compose Multiplatform -- 기본 의존성 (domain, designsystem, navigation, lifecycle, koin) +- Kotlin Multiplatform (Android JVM 11 + iOS) +- Compose Multiplatform (UI, Material3, Navigation) +- Kotlin Serialization (JSON 직렬화) +- 기본 의존성: + - **프로젝트**: domain, designsystem + - **Navigation**: androidx-navigation-compose + - **Lifecycle**: androidx-lifecycle-viewmodel-compose, androidx-lifecycle-runtime-compose + - **DI**: koin bundle (core, compose, compose-viewmodel) + - **Kotlinx**: coroutines-core, serialization-json, datetime + - **테스트**: kotlin-test, koin-test, kotlinx-coroutines-test **사용 예시:** ```kotlin @@ -33,11 +40,10 @@ kotlin { sourceSets { commonMain.dependencies { // feature 플러그인이 자동으로 추가하는 의존성: - // - project(":domain") - // - project(":designsystem") - // - androidx-navigation-compose - // - androidx-lifecycle-runtime-compose - // - koin-compose-viewmodel + // ✅ domain, designsystem 프로젝트 + // ✅ navigation, lifecycle, koin + // ✅ coroutines, serialization, datetime + // ✅ Compose Multiplatform (UI, Material3 등) // 추가 의존성만 여기에 작성 implementation(libs.ktor.client.core) diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index cdf7563..9f87d21 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -7,13 +7,13 @@ plugins { group = "com.peto.droidmorning.buildlogic" java { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 } kotlin { compilerOptions { - jvmTarget = JvmTarget.JVM_17 + jvmTarget = JvmTarget.JVM_11 } } diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/AndroidLibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/AndroidLibraryConventionPlugin.kt index b4d3593..6fb75e8 100644 --- a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/AndroidLibraryConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/AndroidLibraryConventionPlugin.kt @@ -18,15 +18,15 @@ class AndroidLibraryConventionPlugin : Plugin { } extensions.configure { - compileSdk = 35 + compileSdk = 36 defaultConfig { - minSdk = 26 + minSdk = 24 } compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 } buildFeatures { diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/DroidMorningFeaturePlugin.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/DroidMorningFeaturePlugin.kt index f1a33a7..0f45e63 100644 --- a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/DroidMorningFeaturePlugin.kt +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/DroidMorningFeaturePlugin.kt @@ -21,6 +21,7 @@ class DroidMorningFeaturePlugin : Plugin { apply(libs.findPlugin("kotlin-multiplatform").get().get().pluginId) apply(libs.findPlugin("compose-multiplatform").get().get().pluginId) apply(libs.findPlugin("kotlin-compose").get().get().pluginId) + apply(libs.findPlugin("kotlin-serialization").get().get().pluginId) } apply() @@ -35,9 +36,26 @@ class DroidMorningFeaturePlugin : Plugin { dependencies { implementation(project(":domain")) implementation(project(":designsystem")) + + // Navigation & Lifecycle implementation(libs.library("androidx-navigation-compose")) + implementation(libs.library("androidx-lifecycle-viewmodel-compose")) implementation(libs.library("androidx-lifecycle-runtime-compose")) - implementation(libs.library("koin-compose-viewmodel")) + + // Dependency Injection + implementation(libs.bundle("koin")) + + // Kotlinx + implementation(libs.library("kotlinx-coroutines-core")) + implementation(libs.library("kotlinx-serialization-json")) + implementation(libs.library("kotlinx-datetime")) + } + } + commonTest { + dependencies { + implementation(libs.library("kotlin-test")) + implementation(libs.library("koin-test")) + implementation(libs.library("kotlinx-coroutines-test")) } } } diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/KotlinMultiPlatformAndroidPlugin.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/KotlinMultiPlatformAndroidPlugin.kt index 06ec441..5c71a4a 100644 --- a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/KotlinMultiPlatformAndroidPlugin.kt +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/KotlinMultiPlatformAndroidPlugin.kt @@ -19,7 +19,7 @@ class KotlinMultiPlatformAndroidPlugin : Plugin { extensions.configure { androidTarget { - compilerOptions.jvmTarget.set(JvmTarget.JVM_17) + compilerOptions.jvmTarget.set(JvmTarget.JVM_11) } } @@ -28,8 +28,8 @@ class KotlinMultiPlatformAndroidPlugin : Plugin { } compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 } packaging { diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/KotlinMultiPlatformPlugin.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/KotlinMultiPlatformPlugin.kt index 513e888..2525718 100644 --- a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/KotlinMultiPlatformPlugin.kt +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/KotlinMultiPlatformPlugin.kt @@ -20,7 +20,7 @@ class KotlinMultiPlatformPlugin : Plugin { extensions.configure { tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile::class.java) { compilerOptions { - jvmTarget.set(JvmTarget.JVM_17) + jvmTarget.set(JvmTarget.JVM_11) } } From 7ac471fb2674de12f86e92dfcf2430afe22124c7 Mon Sep 17 00:00:00 2001 From: chanho0908 Date: Tue, 20 Jan 2026 12:32:22 +0900 Subject: [PATCH 06/12] =?UTF-8?q?refactor:=20build-logic=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=20=EA=B5=AC=EC=A1=B0=20=EA=B0=9C=EC=84=A0=20?= =?UTF-8?q?=EB=B0=8F=20=ED=99=95=EC=9E=A5=20=ED=95=A8=EC=88=98=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Convention Plugin 패키지 구조 평탄화 (app/ 디렉토리 제거) - Extension 함수들을 extentions 패키지로 분리 - VersionCatalogExtensions 추가하여 타입 안전성 개선 - ComposeExtensions를 ProjectExtensions에 통합 - README 문서 업데이트 (모듈화 가이드 개선) - Gradle 메모리 설정 최적화 🤖 Generated with [Firebender](https://firebender.com) Co-Authored-By: Firebender --- build-logic/README.md | 216 +++++++++++++++--- build-logic/convention/build.gradle.kts | 14 +- .../AndroidLibraryConventionPlugin.kt | 2 +- .../ComposeMultiplatformConventionPlugin.kt | 10 +- .../{app => }/DroidMorningFeaturePlugin.kt | 33 ++- .../KotlinMultiPlatformAndroidPlugin.kt | 9 +- .../KotlinMultiPlatformPlugin.kt | 13 +- .../KotlinMultiPlatformiOSPlugin.kt | 2 +- .../KotlinMultiplatformConventionPlugin.kt | 9 +- .../app/primitive/ComposeExtensions.kt | 43 ---- .../ProjectExtensions.kt} | 42 ++-- .../extentions/VersionCatalogExtensions.kt | 25 ++ gradle.properties | 3 +- gradle/libs.versions.toml | 9 + 14 files changed, 282 insertions(+), 148 deletions(-) rename build-logic/convention/src/main/kotlin/com/peto/droidmorning/{app => }/AndroidLibraryConventionPlugin.kt (96%) rename build-logic/convention/src/main/kotlin/com/peto/droidmorning/{app => }/ComposeMultiplatformConventionPlugin.kt (55%) rename build-logic/convention/src/main/kotlin/com/peto/droidmorning/{app => }/DroidMorningFeaturePlugin.kt (59%) rename build-logic/convention/src/main/kotlin/com/peto/droidmorning/{app/primitive => }/KotlinMultiPlatformAndroidPlugin.kt (87%) rename build-logic/convention/src/main/kotlin/com/peto/droidmorning/{app/primitive => }/KotlinMultiPlatformPlugin.kt (69%) rename build-logic/convention/src/main/kotlin/com/peto/droidmorning/{app/primitive => }/KotlinMultiPlatformiOSPlugin.kt (95%) rename build-logic/convention/src/main/kotlin/com/peto/droidmorning/{app => }/KotlinMultiplatformConventionPlugin.kt (60%) delete mode 100644 build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/ComposeExtensions.kt rename build-logic/convention/src/main/kotlin/com/peto/droidmorning/{app/Extensions.kt => extentions/ProjectExtensions.kt} (58%) create mode 100644 build-logic/convention/src/main/kotlin/com/peto/droidmorning/extentions/VersionCatalogExtensions.kt diff --git a/build-logic/README.md b/build-logic/README.md index 22a2af4..bcbf7ea 100644 --- a/build-logic/README.md +++ b/build-logic/README.md @@ -8,7 +8,7 @@ DroidMorning 프로젝트의 Gradle Convention Plugin 모듈입니다. ### 🎯 High-Level Plugins (권장) #### 1. `droidmorning.feature` ⭐ -Feature 모듈을 위한 통합 플러그인입니다. 한 번에 모든 설정을 적용합니다. +Feature 모듈을 위한 통합 플러그인입니다. UI 기능 모듈에 필요한 기본 설정을 제공합니다. **적용 방법:** ```kotlin @@ -22,16 +22,16 @@ plugins { - Compose Multiplatform (UI, Material3, Navigation) - Kotlin Serialization (JSON 직렬화) - 기본 의존성: - - **프로젝트**: domain, designsystem - **Navigation**: androidx-navigation-compose - **Lifecycle**: androidx-lifecycle-viewmodel-compose, androidx-lifecycle-runtime-compose - **DI**: koin bundle (core, compose, compose-viewmodel) - - **Kotlinx**: coroutines-core, serialization-json, datetime + - **Kotlinx**: coroutines-core, serialization-json, collections-immutable + - **Logging**: napier - **테스트**: kotlin-test, koin-test, kotlinx-coroutines-test **사용 예시:** ```kotlin -// feature/home/build.gradle.kts +// feature/exam/detail/build.gradle.kts plugins { id("droidmorning.feature") } @@ -39,13 +39,12 @@ plugins { kotlin { sourceSets { commonMain.dependencies { - // feature 플러그인이 자동으로 추가하는 의존성: - // ✅ domain, designsystem 프로젝트 - // ✅ navigation, lifecycle, koin - // ✅ coroutines, serialization, datetime - // ✅ Compose Multiplatform (UI, Material3 등) + // 필요한 core 모듈을 명시적으로 추가 + implementation(projects.core.domain) + implementation(projects.core.designSystem) + implementation(projects.core.ui) - // 추가 의존성만 여기에 작성 + // 추가 의존성 implementation(libs.ktor.client.core) } } @@ -109,54 +108,171 @@ plugins { ## 🚀 사용 예시 -### Feature 모듈 생성 (권장) +### 권장 모듈 구조 +``` +📁 build-logic // Convention Plugin +📁 app // Application 진입점 + +📁 core + ├─ :core:common // 공용 유틸 + ├─ :core:ui // 공용 UI + ├─ :core:navigation // Navigation + ├─ :core:design-system // 디자인 시스템 + ├─ :core:network // 네트워크 + ├─ :core:domain // Domain + └─ :core:data // Data + +📁 feature + ├─ :feature:exam:complete // Feature + └─ :feature:exam:detail // Feature +``` + +### Feature 모듈 생성 ```kotlin -// feature/home/build.gradle.kts +// feature/exam/detail/build.gradle.kts plugins { id("droidmorning.feature") } -// 기본 설정이 모두 포함되어 있으므로 추가 의존성만 작성 kotlin { sourceSets { commonMain.dependencies { - implementation(libs.kotlinx.datetime) + // 필요한 core 모듈 추가 + implementation(projects.core.domain) + implementation(projects.core.designSystem) + implementation(projects.core.ui) + implementation(projects.core.navigation) } } } ``` ### Core 모듈 생성 + +각 Core 모듈은 기본 플러그인을 조합하여 사용합니다. + +#### Domain 모듈 (순수 모델 + Repository Interface) +```kotlin +// core/domain/build.gradle.kts +plugins { + id("droidmorning.kotlin.multiplatform") +} + +// 순수 도메인 - 추가 의존성 불필요 +``` + +#### Data 모듈 (DataSource + Repository 구현) +```kotlin +// core/data/build.gradle.kts +plugins { + id("droidmorning.kotlin.multiplatform") + alias(libs.plugins.kotlin.serialization) +} + +kotlin { + sourceSets { + commonMain.dependencies { + implementation(projects.core.domain) + implementation(projects.core.network) + + // DI & Kotlinx + implementation(libs.bundles.koin) + implementation(libs.kotlinx.coroutines.core) + implementation(libs.kotlinx.serialization.json) + } + commonTest.dependencies { + implementation(libs.kotlin.test) + implementation(libs.koin.test) + implementation(libs.kotlinx.coroutines.test) + } + } +} +``` + +#### Network 모듈 (Ktor + Supabase) ```kotlin // core/network/build.gradle.kts plugins { id("droidmorning.kotlin.multiplatform") - id("droidmorning.android.library") + alias(libs.plugins.kotlin.serialization) } kotlin { sourceSets { + androidMain.dependencies { + implementation(libs.ktor.client.okhttp) + } commonMain.dependencies { - implementation(libs.ktor.client.core) + // Network + implementation(libs.bundles.ktor.common) + implementation(platform(libs.supabase.bom)) + implementation(libs.bundles.supabase) + + // DI & Kotlinx + implementation(libs.bundles.koin) + implementation(libs.kotlinx.coroutines.core) implementation(libs.kotlinx.serialization.json) + + // Logging + implementation(libs.napier) + } + iosMain.dependencies { + implementation(libs.ktor.client.darwin) } } } ``` -### UI 모듈 생성 +#### UI 모듈 (공용 Composable) ```kotlin // core/ui/build.gradle.kts plugins { id("droidmorning.kotlin.multiplatform") - id("droidmorning.android.library") id("droidmorning.compose.multiplatform") } kotlin { sourceSets { commonMain.dependencies { - implementation(projects.designsystem) + implementation(projects.core.designSystem) + } + } +} +``` + +#### Common 모듈 (유틸리티) +```kotlin +// core/common/build.gradle.kts +plugins { + id("droidmorning.kotlin.multiplatform") +} + +kotlin { + sourceSets { + commonMain.dependencies { + implementation(libs.kotlinx.coroutines.core) + implementation(libs.kotlinx.datetime) + implementation(libs.napier) + } + } +} +``` + +#### Navigation 모듈 +```kotlin +// core/navigation/build.gradle.kts +plugins { + id("droidmorning.kotlin.multiplatform") + id("droidmorning.compose.multiplatform") + alias(libs.plugins.kotlin.serialization) +} + +kotlin { + sourceSets { + commonMain.dependencies { + implementation(projects.core.common) + implementation(libs.androidx.navigation.compose) + implementation(libs.kotlinx.serialization.json) } } } @@ -169,33 +285,50 @@ build-logic/ ├── convention/ │ ├── build.gradle.kts │ └── src/main/kotlin/com/peto/droidmorning/app/ -│ ├── Extensions.kt # 유틸리티 확장 함수 +│ ├── extentions/ +│ │ ├── ProjectExtensions.kt # Project 확장 함수 +│ │ └── VersionCatalogExtensions.kt # VersionCatalog 확장 함수 +│ │ +│ ├── primitive/ # 저수준 플러그인 +│ │ ├── KotlinMultiPlatformPlugin.kt # 기본 KMP 플러그인 +│ │ ├── KotlinMultiPlatformAndroidPlugin.kt # Android 타겟 플러그인 +│ │ └── KotlinMultiPlatformiOSPlugin.kt # iOS 타겟 플러그인 +│ │ │ ├── AndroidLibraryConventionPlugin.kt # Android Library 플러그인 │ ├── KotlinMultiplatformConventionPlugin.kt # KMP 컨벤션 플러그인 │ ├── ComposeMultiplatformConventionPlugin.kt # Compose 컨벤션 플러그인 -│ ├── DroidMorningFeaturePlugin.kt # Feature 통합 플러그인 -│ └── primitive/ -│ ├── ComposeExtensions.kt # Compose 확장 함수 -│ ├── KotlinMultiPlatformPlugin.kt # 기본 KMP 플러그인 -│ ├── KotlinMultiPlatformAndroidPlugin.kt # Android 타겟 플러그인 -│ └── KotlinMultiPlatformiOSPlugin.kt # iOS 타겟 플러그인 +│ └── DroidMorningFeaturePlugin.kt # Feature 통합 플러그인 └── settings.gradle.kts ``` ## 🎨 아키텍처 ``` -High-Level Plugins -├─ droidmorning.feature (모든 것 포함) -│ └─ 내부적으로 primitive 플러그인들 조합 -│ +Convention Plugins 계층 구조 + +High-Level Plugins (Feature용) +└─ droidmorning.feature + ├─ KMP (Android + iOS) + ├─ Compose Multiplatform + ├─ Serialization + └─ 기본 의존성 (Navigation, Lifecycle, Koin 등) + +Base Plugins (Core 모듈용 - 조합해서 사용) ├─ droidmorning.kotlin.multiplatform │ ├─ droidmorning.kmp │ ├─ droidmorning.kmp.android │ └─ droidmorning.kmp.ios │ -└─ droidmorning.compose.multiplatform - └─ Compose 의존성 자동 설정 +├─ droidmorning.compose.multiplatform +│ └─ Compose 의존성 자동 설정 +│ +└─ droidmorning.android.library + └─ Android Library 기본 설정 + +Primitive Plugins (고급 사용자용) +├─ droidmorning.kmp +├─ droidmorning.kmp.android +└─ droidmorning.kmp.ios ``` ## 🔧 수정 방법 @@ -209,6 +342,19 @@ Convention Plugin을 수정한 후에는 Gradle sync를 실행하여 변경사 ## 💡 팁 -1. **Feature 모듈을 만들 때는 `droidmorning.feature`만 사용하세요** - 가장 간단하고 빠릅니다. -2. **Core 모듈은 필요한 플러그인만 선택적으로 적용하세요** - 불필요한 의존성을 피할 수 있습니다. -3. **Primitive 플러그인은 특별한 경우가 아니면 직접 사용하지 마세요** - High-level 플러그인이 더 편리합니다. +1. **Feature 모듈은 `droidmorning.feature` 플러그인을 사용하세요** + - UI 기능 모듈에 필요한 모든 기본 설정이 포함되어 있습니다 + - 필요한 core 모듈만 명시적으로 추가하세요 + +2. **Core 모듈은 기본 플러그인을 조합하여 사용하세요** + - 각 모듈의 특성에 맞게 플러그인을 선택하고 조합합니다 + - 예: Domain → `kotlin.multiplatform`, Network → `kotlin.multiplatform` + `serialization` + - 필요한 의존성은 각 모듈에서 명시적으로 추가합니다 + +3. **의존성은 명시적으로 관리하세요** + - Convention Plugin은 공통 설정만 제공합니다 + - 각 모듈에서 필요한 의존성을 직접 추가하면 의존 관계가 명확해집니다 + - 불필요한 의존성을 피할 수 있어 빌드 시간이 단축됩니다 + +4. **Primitive 플러그인은 특별한 경우가 아니면 직접 사용하지 마세요** + - High-level 플러그인이 더 편리하고 일관성있는 설정을 제공합니다 diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index 9f87d21..ad9fc4c 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -28,31 +28,31 @@ gradlePlugin { plugins { register("kmpPrimitive") { id = "droidmorning.kmp" - implementationClass = "com.peto.droidmorning.app.primitive.KotlinMultiPlatformPlugin" + implementationClass = "com.peto.droidmorning.KotlinMultiPlatformPlugin" } register("kmpAndroid") { id = "droidmorning.kmp.android" - implementationClass = "com.peto.droidmorning.app.primitive.KotlinMultiPlatformAndroidPlugin" + implementationClass = "com.peto.droidmorning.KotlinMultiPlatformAndroidPlugin" } register("kmpIos") { id = "droidmorning.kmp.ios" - implementationClass = "com.peto.droidmorning.app.primitive.KotlinMultiPlatformiOSPlugin" + implementationClass = "com.peto.droidmorning.KotlinMultiPlatformiOSPlugin" } register("androidLibrary") { id = "droidmorning.android.library" - implementationClass = "com.peto.droidmorning.app.AndroidLibraryConventionPlugin" + implementationClass = "com.peto.droidmorning.AndroidLibraryConventionPlugin" } register("kotlinMultiplatform") { id = "droidmorning.kotlin.multiplatform" - implementationClass = "com.peto.droidmorning.app.KotlinMultiplatformConventionPlugin" + implementationClass = "com.peto.droidmorning.KotlinMultiplatformConventionPlugin" } register("composeMultiplatform") { id = "droidmorning.compose.multiplatform" - implementationClass = "com.peto.droidmorning.app.ComposeMultiplatformConventionPlugin" + implementationClass = "com.peto.droidmorning.ComposeMultiplatformConventionPlugin" } register("droidmorningFeature") { id = "droidmorning.feature" - implementationClass = "com.peto.droidmorning.app.DroidMorningFeaturePlugin" + implementationClass = "com.peto.droidmorning.DroidMorningFeaturePlugin" } } } diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/AndroidLibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/AndroidLibraryConventionPlugin.kt similarity index 96% rename from build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/AndroidLibraryConventionPlugin.kt rename to build-logic/convention/src/main/kotlin/com/peto/droidmorning/AndroidLibraryConventionPlugin.kt index 6fb75e8..2300601 100644 --- a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/AndroidLibraryConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/AndroidLibraryConventionPlugin.kt @@ -1,4 +1,4 @@ -package com.peto.droidmorning.app +package com.peto.droidmorning import com.android.build.gradle.LibraryExtension import org.gradle.api.JavaVersion diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/ComposeMultiplatformConventionPlugin.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/ComposeMultiplatformConventionPlugin.kt similarity index 55% rename from build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/ComposeMultiplatformConventionPlugin.kt rename to build-logic/convention/src/main/kotlin/com/peto/droidmorning/ComposeMultiplatformConventionPlugin.kt index f31e077..a96eaf7 100644 --- a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/ComposeMultiplatformConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/ComposeMultiplatformConventionPlugin.kt @@ -1,6 +1,8 @@ -package com.peto.droidmorning.app +package com.peto.droidmorning -import com.peto.droidmorning.app.primitive.composeMultiplatformDependencies +import com.peto.droidmorning.extentions.composeMultiplatformDependencies +import com.peto.droidmorning.extentions.libs +import com.peto.droidmorning.extentions.plugin import org.gradle.api.Plugin import org.gradle.api.Project @@ -11,8 +13,8 @@ import org.gradle.api.Project class ComposeMultiplatformConventionPlugin : Plugin { override fun apply(target: Project) = with(target) { with(pluginManager) { - apply(libs.findPlugin("compose-multiplatform").get().get().pluginId) - apply(libs.findPlugin("kotlin-compose").get().get().pluginId) + apply(libs.plugin("compose-multiplatform").pluginId) + apply(libs.plugin("kotlin-compose").pluginId) } composeMultiplatformDependencies() diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/DroidMorningFeaturePlugin.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/DroidMorningFeaturePlugin.kt similarity index 59% rename from build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/DroidMorningFeaturePlugin.kt rename to build-logic/convention/src/main/kotlin/com/peto/droidmorning/DroidMorningFeaturePlugin.kt index 0f45e63..c6eeb89 100644 --- a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/DroidMorningFeaturePlugin.kt +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/DroidMorningFeaturePlugin.kt @@ -1,9 +1,10 @@ -package com.peto.droidmorning.app +package com.peto.droidmorning -import com.peto.droidmorning.app.primitive.KotlinMultiPlatformAndroidPlugin -import com.peto.droidmorning.app.primitive.KotlinMultiPlatformPlugin -import com.peto.droidmorning.app.primitive.KotlinMultiPlatformiOSPlugin -import com.peto.droidmorning.app.primitive.composeMultiplatformDependencies +import com.peto.droidmorning.extentions.bundle +import com.peto.droidmorning.extentions.composeMultiplatformDependencies +import com.peto.droidmorning.extentions.library +import com.peto.droidmorning.extentions.libs +import com.peto.droidmorning.extentions.plugin import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.kotlin.dsl.apply @@ -12,16 +13,17 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension /** * DroidMorning Feature 모듈 통합 플러그인 - * Feature 모듈에 필요한 모든 설정을 한번에 적용합니다. + * Feature 모듈에 필요한 기본 설정을 제공합니다. + * 프로젝트 의존성(domain, designsystem 등)은 각 모듈에서 직접 추가해야 합니다. */ class DroidMorningFeaturePlugin : Plugin { override fun apply(target: Project) = with(target) { with(pluginManager) { - apply(libs.findPlugin("android-library").get().get().pluginId) - apply(libs.findPlugin("kotlin-multiplatform").get().get().pluginId) - apply(libs.findPlugin("compose-multiplatform").get().get().pluginId) - apply(libs.findPlugin("kotlin-compose").get().get().pluginId) - apply(libs.findPlugin("kotlin-serialization").get().get().pluginId) + apply(libs.plugin("android-library").pluginId) + apply(libs.plugin("kotlin-multiplatform").pluginId) + apply(libs.plugin("compose-multiplatform").pluginId) + apply(libs.plugin("kotlin-compose").pluginId) + apply(libs.plugin("kotlin-serialization").pluginId) } apply() @@ -34,21 +36,16 @@ class DroidMorningFeaturePlugin : Plugin { sourceSets.apply { commonMain { dependencies { - implementation(project(":domain")) - implementation(project(":designsystem")) - - // Navigation & Lifecycle implementation(libs.library("androidx-navigation-compose")) implementation(libs.library("androidx-lifecycle-viewmodel-compose")) implementation(libs.library("androidx-lifecycle-runtime-compose")) - // Dependency Injection implementation(libs.bundle("koin")) - // Kotlinx implementation(libs.library("kotlinx-coroutines-core")) implementation(libs.library("kotlinx-serialization-json")) - implementation(libs.library("kotlinx-datetime")) + implementation(libs.library("kotlinx-collections-immutable")) + implementation(libs.library("napier")) } } commonTest { diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/KotlinMultiPlatformAndroidPlugin.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiPlatformAndroidPlugin.kt similarity index 87% rename from build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/KotlinMultiPlatformAndroidPlugin.kt rename to build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiPlatformAndroidPlugin.kt index 5c71a4a..df9bcb2 100644 --- a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/KotlinMultiPlatformAndroidPlugin.kt +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiPlatformAndroidPlugin.kt @@ -1,7 +1,8 @@ -package com.peto.droidmorning.app.primitive +package com.peto.droidmorning -import com.peto.droidmorning.app.androidExtension -import com.peto.droidmorning.app.libs +import com.peto.droidmorning.extentions.androidExtension +import com.peto.droidmorning.extentions.libs +import com.peto.droidmorning.extentions.version import org.gradle.api.JavaVersion import org.gradle.api.Plugin import org.gradle.api.Project @@ -15,7 +16,7 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension class KotlinMultiPlatformAndroidPlugin : Plugin { override fun apply(target: Project): Unit = with(target) { androidExtension.apply { - compileSdk = libs.findVersion("compileSdk").get().requiredVersion.toInt() + compileSdk = libs.version("compileSdk").toInt() extensions.configure { androidTarget { diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/KotlinMultiPlatformPlugin.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiPlatformPlugin.kt similarity index 69% rename from build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/KotlinMultiPlatformPlugin.kt rename to build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiPlatformPlugin.kt index 2525718..24511e8 100644 --- a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/KotlinMultiPlatformPlugin.kt +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiPlatformPlugin.kt @@ -1,12 +1,15 @@ -package com.peto.droidmorning.app.primitive +package com.peto.droidmorning -import com.peto.droidmorning.app.libs +import com.peto.droidmorning.extentions.libs +import com.peto.droidmorning.extentions.plugin import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.kotlin.dsl.configure import org.gradle.kotlin.dsl.withType import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +import org.jetbrains.kotlin.gradle.tasks.KotlinNativeLink /** * 기본 Kotlin Multiplatform 설정 플러그인 @@ -14,11 +17,11 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension class KotlinMultiPlatformPlugin : Plugin { override fun apply(target: Project) = with(target) { with(pluginManager) { - apply(libs.findPlugin("kotlin-multiplatform").get().get().pluginId) + apply(libs.plugin("kotlin-multiplatform").pluginId) } extensions.configure { - tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile::class.java) { + tasks.withType(KotlinCompile::class.java) { compilerOptions { jvmTarget.set(JvmTarget.JVM_11) } @@ -30,7 +33,7 @@ class KotlinMultiPlatformPlugin : Plugin { applyDefaultHierarchyTemplate() - tasks.withType().configureEach { + tasks.withType().configureEach { notCompatibleWithConfigurationCache("Configuration cache not supported for a system property read at configuration time") } } diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/KotlinMultiPlatformiOSPlugin.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiPlatformiOSPlugin.kt similarity index 95% rename from build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/KotlinMultiPlatformiOSPlugin.kt rename to build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiPlatformiOSPlugin.kt index e7ef671..6296d88 100644 --- a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/KotlinMultiPlatformiOSPlugin.kt +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiPlatformiOSPlugin.kt @@ -1,4 +1,4 @@ -package com.peto.droidmorning.app.primitive +package com.peto.droidmorning import org.gradle.api.Plugin import org.gradle.api.Project diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/KotlinMultiplatformConventionPlugin.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiplatformConventionPlugin.kt similarity index 60% rename from build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/KotlinMultiplatformConventionPlugin.kt rename to build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiplatformConventionPlugin.kt index f9cf8f1..bc7a7a8 100644 --- a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/KotlinMultiplatformConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiplatformConventionPlugin.kt @@ -1,8 +1,7 @@ -package com.peto.droidmorning.app +package com.peto.droidmorning -import com.peto.droidmorning.app.primitive.KotlinMultiPlatformAndroidPlugin -import com.peto.droidmorning.app.primitive.KotlinMultiPlatformPlugin -import com.peto.droidmorning.app.primitive.KotlinMultiPlatformiOSPlugin +import com.peto.droidmorning.extentions.libs +import com.peto.droidmorning.extentions.plugin import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.kotlin.dsl.apply @@ -14,7 +13,7 @@ import org.gradle.kotlin.dsl.apply class KotlinMultiplatformConventionPlugin : Plugin { override fun apply(target: Project) = with(target) { with(pluginManager) { - apply(libs.findPlugin("kotlin-multiplatform").get().get().pluginId) + apply(libs.plugin("kotlin-multiplatform").pluginId) } apply() diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/ComposeExtensions.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/ComposeExtensions.kt deleted file mode 100644 index 602c36e..0000000 --- a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/primitive/ComposeExtensions.kt +++ /dev/null @@ -1,43 +0,0 @@ -package com.peto.droidmorning.app.primitive - -import org.gradle.api.Project -import org.gradle.kotlin.dsl.configure -import org.gradle.kotlin.dsl.dependencies -import org.gradle.kotlin.dsl.getByType -import org.jetbrains.compose.ComposeExtension -import org.jetbrains.compose.resources.ResourcesExtension -import org.jetbrains.kotlin.compose.compiler.gradle.ComposeCompilerGradlePluginExtension -import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension - -fun Project.composeCompiler(block: ComposeCompilerGradlePluginExtension.() -> Unit) { - extensions.configure(block) -} - -val Project.compose: ComposeExtension - get() = extensions.getByType() - -fun ComposeExtension.resources(block: ResourcesExtension.() -> Unit) { - extensions.configure(block) -} - -internal fun Project.composeMultiplatformDependencies() { - val composeDependencies = extensions.getByType().dependencies - extensions.configure { - sourceSets.apply { - commonMain { - dependencies { - implementation(composeDependencies.runtime) - implementation(composeDependencies.foundation) - implementation(composeDependencies.material3) - implementation(composeDependencies.ui) - implementation(composeDependencies.components.resources) - implementation(composeDependencies.components.uiToolingPreview) - } - } - } - } - - dependencies { - "debugImplementation"("org.jetbrains.compose.ui:ui-tooling:1.10.0") - } -} diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/Extensions.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/extentions/ProjectExtensions.kt similarity index 58% rename from build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/Extensions.kt rename to build-logic/convention/src/main/kotlin/com/peto/droidmorning/extentions/ProjectExtensions.kt index 91386c5..51e8203 100644 --- a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/app/Extensions.kt +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/extentions/ProjectExtensions.kt @@ -1,22 +1,16 @@ -package com.peto.droidmorning.app +package com.peto.droidmorning.extentions import com.android.build.api.dsl.ApplicationExtension import com.android.build.api.dsl.CommonExtension import com.android.build.api.dsl.LibraryExtension import org.gradle.api.Project -import org.gradle.api.artifacts.ExternalModuleDependencyBundle -import org.gradle.api.artifacts.MinimalExternalModuleDependency import org.gradle.api.artifacts.VersionCatalog import org.gradle.api.artifacts.VersionCatalogsExtension -import org.gradle.api.plugins.ExtensionContainer import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.dependencies import org.gradle.kotlin.dsl.getByType -import org.gradle.plugin.use.PluginDependency import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension -internal val ExtensionContainer.libs: VersionCatalog - get() = getByType().named("libs") - internal val Project.libs: VersionCatalog get() = extensions.getByType().named("libs") @@ -32,22 +26,22 @@ internal val Project.androidExtension: CommonExtension<*, *, *, *, *, *> .onFailure { println("Could not find Library or Application extension from this project") } .getOrThrow() -internal fun VersionCatalog.version(name: String): String { - return findVersion(name).get().requiredVersion -} - -internal fun VersionCatalog.library(name: String): MinimalExternalModuleDependency { - return findLibrary(name).get().get() -} - -internal fun VersionCatalog.plugin(name: String): PluginDependency { - return findPlugin(name).get().get() -} - -internal fun VersionCatalog.bundle(name: String): ExternalModuleDependencyBundle { - return findBundle(name).get().get() -} - internal fun Project.kotlin(action: KotlinMultiplatformExtension.() -> Unit) { extensions.configure(action) } + +internal fun Project.composeMultiplatformDependencies() { + extensions.configure { + sourceSets.apply { + commonMain { + dependencies { + implementation(libs.bundle("compose-multiplatform")) + } + } + } + } + + dependencies { + "debugImplementation"(libs.library("compose-ui-tooling")) + } +} diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/extentions/VersionCatalogExtensions.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/extentions/VersionCatalogExtensions.kt new file mode 100644 index 0000000..6d4f9b4 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/extentions/VersionCatalogExtensions.kt @@ -0,0 +1,25 @@ +package com.peto.droidmorning.extentions + +import org.gradle.api.Project +import org.gradle.api.artifacts.ExternalModuleDependencyBundle +import org.gradle.api.artifacts.MinimalExternalModuleDependency +import org.gradle.api.artifacts.VersionCatalog +import org.gradle.api.artifacts.VersionCatalogsExtension +import org.gradle.kotlin.dsl.getByType +import org.gradle.plugin.use.PluginDependency + +internal fun VersionCatalog.version(name: String): String { + return findVersion(name).get().requiredVersion +} + +internal fun VersionCatalog.library(name: String): MinimalExternalModuleDependency { + return findLibrary(name).get().get() +} + +internal fun VersionCatalog.plugin(name: String): PluginDependency { + return findPlugin(name).get().get() +} + +internal fun VersionCatalog.bundle(name: String): ExternalModuleDependencyBundle { + return findBundle(name).get().get() +} diff --git a/gradle.properties b/gradle.properties index b7762d3..bf52f7e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,9 +3,10 @@ kotlin.code.style=official kotlin.daemon.jvmargs=-Xmx3072M #Gradle -org.gradle.jvmargs=-Xmx4096M -Dfile.encoding=UTF-8 +org.gradle.jvmargs=-Xmx8g -XX:MaxMetaspaceSize=2g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 org.gradle.configuration-cache=true org.gradle.caching=true +org.gradle.parallel=true #Android android.nonTransitiveRClass=true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index abf011f..da53644 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -227,3 +227,12 @@ buildkonfig = { id = "com.codingfeline.buildkonfig", version.ref = "buildkonfig" # Ktlint ktlint = { id = "org.jlleitschuh.gradle.ktlint", version.ref = "ktlint" } + +# DroidMorning Convention Plugins +droidmorning-kmp = { id = "droidmorning.kmp" } +droidmorning-kmp-android = { id = "droidmorning.kmp.android" } +droidmorning-kmp-ios = { id = "droidmorning.kmp.ios" } +droidmorning-android-library = { id = "droidmorning.android.library" } +droidmorning-kotlin-multiplatform = { id = "droidmorning.kotlin.multiplatform" } +droidmorning-compose-multiplatform = { id = "droidmorning.compose.multiplatform" } +droidmorning-feature = { id = "droidmorning.feature" } From fcd8b93c2545f1585a6cc361083cb8caf1cae375 Mon Sep 17 00:00:00 2001 From: chanho0908 Date: Tue, 20 Jan 2026 12:36:24 +0900 Subject: [PATCH 07/12] =?UTF-8?q?docs:=20build-logic=EC=9D=98=20README.md?= =?UTF-8?q?=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build-logic/README.md | 360 ------------------------------------------ 1 file changed, 360 deletions(-) delete mode 100644 build-logic/README.md diff --git a/build-logic/README.md b/build-logic/README.md deleted file mode 100644 index bcbf7ea..0000000 --- a/build-logic/README.md +++ /dev/null @@ -1,360 +0,0 @@ -# Build Logic - -DroidMorning 프로젝트의 Gradle Convention Plugin 모듈입니다. -각 모듈의 빌드 설정을 중앙화하고 일관성있게 관리합니다. - -## 📦 제공하는 Convention Plugins - -### 🎯 High-Level Plugins (권장) - -#### 1. `droidmorning.feature` ⭐ -Feature 모듈을 위한 통합 플러그인입니다. UI 기능 모듈에 필요한 기본 설정을 제공합니다. - -**적용 방법:** -```kotlin -plugins { - id("droidmorning.feature") -} -``` - -**포함 설정:** -- Kotlin Multiplatform (Android JVM 11 + iOS) -- Compose Multiplatform (UI, Material3, Navigation) -- Kotlin Serialization (JSON 직렬화) -- 기본 의존성: - - **Navigation**: androidx-navigation-compose - - **Lifecycle**: androidx-lifecycle-viewmodel-compose, androidx-lifecycle-runtime-compose - - **DI**: koin bundle (core, compose, compose-viewmodel) - - **Kotlinx**: coroutines-core, serialization-json, collections-immutable - - **Logging**: napier - - **테스트**: kotlin-test, koin-test, kotlinx-coroutines-test - -**사용 예시:** -```kotlin -// feature/exam/detail/build.gradle.kts -plugins { - id("droidmorning.feature") -} - -kotlin { - sourceSets { - commonMain.dependencies { - // 필요한 core 모듈을 명시적으로 추가 - implementation(projects.core.domain) - implementation(projects.core.designSystem) - implementation(projects.core.ui) - - // 추가 의존성 - implementation(libs.ktor.client.core) - } - } -} -``` - -#### 2. `droidmorning.kotlin.multiplatform` -Kotlin Multiplatform 공통 설정을 제공합니다. - -**적용 방법:** -```kotlin -plugins { - id("droidmorning.kotlin.multiplatform") -} -``` - -**포함 설정:** -- Android target (JVM 17) -- iOS targets (iosX64, iosArm64, iosSimulatorArm64) -- 기본 소스셋 계층 구조 - -#### 3. `droidmorning.compose.multiplatform` -Compose Multiplatform 공통 설정을 제공합니다. - -**적용 방법:** -```kotlin -plugins { - id("droidmorning.kotlin.multiplatform") - id("droidmorning.compose.multiplatform") -} -``` - -**포함 설정:** -- Compose Multiplatform 플러그인 -- Compose Compiler 플러그인 -- 기본 Compose 의존성 (runtime, foundation, material3, ui, resources 등) - -#### 4. `droidmorning.android.library` -Android Library 공통 설정을 제공합니다. - -**적용 방법:** -```kotlin -plugins { - id("droidmorning.android.library") -} -``` - -**포함 설정:** -- compileSdk: 35 -- minSdk: 26 -- Java 17 호환성 -- BuildConfig 활성화 - -### 🔧 Primitive Plugins (고급) - -세밀한 제어가 필요한 경우 사용하는 저수준 플러그인들입니다. - -- `droidmorning.kmp` - 기본 Kotlin Multiplatform 설정 -- `droidmorning.kmp.android` - Android 타겟 설정 -- `droidmorning.kmp.ios` - iOS 타겟 설정 - -## 🚀 사용 예시 - -### 권장 모듈 구조 -``` -📁 build-logic // Convention Plugin -📁 app // Application 진입점 - -📁 core - ├─ :core:common // 공용 유틸 - ├─ :core:ui // 공용 UI - ├─ :core:navigation // Navigation - ├─ :core:design-system // 디자인 시스템 - ├─ :core:network // 네트워크 - ├─ :core:domain // Domain - └─ :core:data // Data - -📁 feature - ├─ :feature:exam:complete // Feature - └─ :feature:exam:detail // Feature -``` - -### Feature 모듈 생성 -```kotlin -// feature/exam/detail/build.gradle.kts -plugins { - id("droidmorning.feature") -} - -kotlin { - sourceSets { - commonMain.dependencies { - // 필요한 core 모듈 추가 - implementation(projects.core.domain) - implementation(projects.core.designSystem) - implementation(projects.core.ui) - implementation(projects.core.navigation) - } - } -} -``` - -### Core 모듈 생성 - -각 Core 모듈은 기본 플러그인을 조합하여 사용합니다. - -#### Domain 모듈 (순수 모델 + Repository Interface) -```kotlin -// core/domain/build.gradle.kts -plugins { - id("droidmorning.kotlin.multiplatform") -} - -// 순수 도메인 - 추가 의존성 불필요 -``` - -#### Data 모듈 (DataSource + Repository 구현) -```kotlin -// core/data/build.gradle.kts -plugins { - id("droidmorning.kotlin.multiplatform") - alias(libs.plugins.kotlin.serialization) -} - -kotlin { - sourceSets { - commonMain.dependencies { - implementation(projects.core.domain) - implementation(projects.core.network) - - // DI & Kotlinx - implementation(libs.bundles.koin) - implementation(libs.kotlinx.coroutines.core) - implementation(libs.kotlinx.serialization.json) - } - commonTest.dependencies { - implementation(libs.kotlin.test) - implementation(libs.koin.test) - implementation(libs.kotlinx.coroutines.test) - } - } -} -``` - -#### Network 모듈 (Ktor + Supabase) -```kotlin -// core/network/build.gradle.kts -plugins { - id("droidmorning.kotlin.multiplatform") - alias(libs.plugins.kotlin.serialization) -} - -kotlin { - sourceSets { - androidMain.dependencies { - implementation(libs.ktor.client.okhttp) - } - commonMain.dependencies { - // Network - implementation(libs.bundles.ktor.common) - implementation(platform(libs.supabase.bom)) - implementation(libs.bundles.supabase) - - // DI & Kotlinx - implementation(libs.bundles.koin) - implementation(libs.kotlinx.coroutines.core) - implementation(libs.kotlinx.serialization.json) - - // Logging - implementation(libs.napier) - } - iosMain.dependencies { - implementation(libs.ktor.client.darwin) - } - } -} -``` - -#### UI 모듈 (공용 Composable) -```kotlin -// core/ui/build.gradle.kts -plugins { - id("droidmorning.kotlin.multiplatform") - id("droidmorning.compose.multiplatform") -} - -kotlin { - sourceSets { - commonMain.dependencies { - implementation(projects.core.designSystem) - } - } -} -``` - -#### Common 모듈 (유틸리티) -```kotlin -// core/common/build.gradle.kts -plugins { - id("droidmorning.kotlin.multiplatform") -} - -kotlin { - sourceSets { - commonMain.dependencies { - implementation(libs.kotlinx.coroutines.core) - implementation(libs.kotlinx.datetime) - implementation(libs.napier) - } - } -} -``` - -#### Navigation 모듈 -```kotlin -// core/navigation/build.gradle.kts -plugins { - id("droidmorning.kotlin.multiplatform") - id("droidmorning.compose.multiplatform") - alias(libs.plugins.kotlin.serialization) -} - -kotlin { - sourceSets { - commonMain.dependencies { - implementation(projects.core.common) - implementation(libs.androidx.navigation.compose) - implementation(libs.kotlinx.serialization.json) - } - } -} -``` - -## 📁 디렉토리 구조 - -``` -build-logic/ -├── convention/ -│ ├── build.gradle.kts -│ └── src/main/kotlin/com/peto/droidmorning/app/ -│ ├── extentions/ -│ │ ├── ProjectExtensions.kt # Project 확장 함수 -│ │ └── VersionCatalogExtensions.kt # VersionCatalog 확장 함수 -│ │ -│ ├── primitive/ # 저수준 플러그인 -│ │ ├── KotlinMultiPlatformPlugin.kt # 기본 KMP 플러그인 -│ │ ├── KotlinMultiPlatformAndroidPlugin.kt # Android 타겟 플러그인 -│ │ └── KotlinMultiPlatformiOSPlugin.kt # iOS 타겟 플러그인 -│ │ -│ ├── AndroidLibraryConventionPlugin.kt # Android Library 플러그인 -│ ├── KotlinMultiplatformConventionPlugin.kt # KMP 컨벤션 플러그인 -│ ├── ComposeMultiplatformConventionPlugin.kt # Compose 컨벤션 플러그인 -│ └── DroidMorningFeaturePlugin.kt # Feature 통합 플러그인 -└── settings.gradle.kts -``` - -## 🎨 아키텍처 - -``` -Convention Plugins 계층 구조 - -High-Level Plugins (Feature용) -└─ droidmorning.feature - ├─ KMP (Android + iOS) - ├─ Compose Multiplatform - ├─ Serialization - └─ 기본 의존성 (Navigation, Lifecycle, Koin 등) - -Base Plugins (Core 모듈용 - 조합해서 사용) -├─ droidmorning.kotlin.multiplatform -│ ├─ droidmorning.kmp -│ ├─ droidmorning.kmp.android -│ └─ droidmorning.kmp.ios -│ -├─ droidmorning.compose.multiplatform -│ └─ Compose 의존성 자동 설정 -│ -└─ droidmorning.android.library - └─ Android Library 기본 설정 - -Primitive Plugins (고급 사용자용) -├─ droidmorning.kmp -├─ droidmorning.kmp.android -└─ droidmorning.kmp.ios -``` - -## 🔧 수정 방법 - -Convention Plugin을 수정한 후에는 Gradle sync를 실행하여 변경사항을 적용해야 합니다: - -```bash -./gradlew --stop -./gradlew tasks -``` - -## 💡 팁 - -1. **Feature 모듈은 `droidmorning.feature` 플러그인을 사용하세요** - - UI 기능 모듈에 필요한 모든 기본 설정이 포함되어 있습니다 - - 필요한 core 모듈만 명시적으로 추가하세요 - -2. **Core 모듈은 기본 플러그인을 조합하여 사용하세요** - - 각 모듈의 특성에 맞게 플러그인을 선택하고 조합합니다 - - 예: Domain → `kotlin.multiplatform`, Network → `kotlin.multiplatform` + `serialization` - - 필요한 의존성은 각 모듈에서 명시적으로 추가합니다 - -3. **의존성은 명시적으로 관리하세요** - - Convention Plugin은 공통 설정만 제공합니다 - - 각 모듈에서 필요한 의존성을 직접 추가하면 의존 관계가 명확해집니다 - - 불필요한 의존성을 피할 수 있어 빌드 시간이 단축됩니다 - -4. **Primitive 플러그인은 특별한 경우가 아니면 직접 사용하지 마세요** - - High-level 플러그인이 더 편리하고 일관성있는 설정을 제공합니다 From fc5f68c52c37fdb7b9dc1b92dfaea6b67054312f Mon Sep 17 00:00:00 2001 From: chanho0908 Date: Tue, 20 Jan 2026 12:42:36 +0900 Subject: [PATCH 08/12] =?UTF-8?q?refactor:=20build-logic=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=20=EA=B0=9C=EC=84=A0=20=EB=B0=8F=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AndroidLibraryConventionPlugin.kt | 10 ++++------ .../droidmorning/DroidMorningFeaturePlugin.kt | 10 +--------- .../droidmorning/KotlinMultiPlatformPlugin.kt | 19 ++++++++----------- .../KotlinMultiplatformConventionPlugin.kt | 10 ---------- .../extentions/ProjectExtensions.kt | 4 ---- .../extentions/VersionCatalogExtensions.kt | 3 --- 6 files changed, 13 insertions(+), 43 deletions(-) diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/AndroidLibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/AndroidLibraryConventionPlugin.kt index 2300601..f6c6f92 100644 --- a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/AndroidLibraryConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/AndroidLibraryConventionPlugin.kt @@ -1,15 +1,13 @@ package com.peto.droidmorning import com.android.build.gradle.LibraryExtension +import com.peto.droidmorning.extentions.libs +import com.peto.droidmorning.extentions.version import org.gradle.api.JavaVersion import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.kotlin.dsl.configure -/** - * Android Library 컨벤션 플러그인 - * 공통 Android 라이브러리 설정을 중앙화합니다. - */ class AndroidLibraryConventionPlugin : Plugin { override fun apply(target: Project) { with(target) { @@ -18,10 +16,10 @@ class AndroidLibraryConventionPlugin : Plugin { } extensions.configure { - compileSdk = 36 + compileSdk = libs.version("compileSdk").toInt() defaultConfig { - minSdk = 24 + minSdk = libs.version("minSdk").toInt() } compileOptions { diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/DroidMorningFeaturePlugin.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/DroidMorningFeaturePlugin.kt index c6eeb89..c509129 100644 --- a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/DroidMorningFeaturePlugin.kt +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/DroidMorningFeaturePlugin.kt @@ -11,18 +11,10 @@ import org.gradle.kotlin.dsl.apply import org.gradle.kotlin.dsl.configure import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension -/** - * DroidMorning Feature 모듈 통합 플러그인 - * Feature 모듈에 필요한 기본 설정을 제공합니다. - * 프로젝트 의존성(domain, designsystem 등)은 각 모듈에서 직접 추가해야 합니다. - */ class DroidMorningFeaturePlugin : Plugin { override fun apply(target: Project) = with(target) { with(pluginManager) { apply(libs.plugin("android-library").pluginId) - apply(libs.plugin("kotlin-multiplatform").pluginId) - apply(libs.plugin("compose-multiplatform").pluginId) - apply(libs.plugin("kotlin-compose").pluginId) apply(libs.plugin("kotlin-serialization").pluginId) } @@ -30,7 +22,7 @@ class DroidMorningFeaturePlugin : Plugin { apply() apply() - composeMultiplatformDependencies() + apply() extensions.configure { sourceSets.apply { diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiPlatformPlugin.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiPlatformPlugin.kt index 24511e8..d1b2385 100644 --- a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiPlatformPlugin.kt +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiPlatformPlugin.kt @@ -11,9 +11,6 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.tasks.KotlinNativeLink -/** - * 기본 Kotlin Multiplatform 설정 플러그인 - */ class KotlinMultiPlatformPlugin : Plugin { override fun apply(target: Project) = with(target) { with(pluginManager) { @@ -21,21 +18,21 @@ class KotlinMultiPlatformPlugin : Plugin { } extensions.configure { - tasks.withType(KotlinCompile::class.java) { - compilerOptions { - jvmTarget.set(JvmTarget.JVM_11) - } - } - compilerOptions { freeCompilerArgs.add("-Xexpect-actual-classes") } applyDefaultHierarchyTemplate() + } - tasks.withType().configureEach { - notCompatibleWithConfigurationCache("Configuration cache not supported for a system property read at configuration time") + tasks.withType().configureEach { + compilerOptions { + jvmTarget.set(JvmTarget.JVM_11) } } + + tasks.withType().configureEach { + notCompatibleWithConfigurationCache("Configuration cache not supported for a system property read at configuration time") + } } } diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiplatformConventionPlugin.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiplatformConventionPlugin.kt index bc7a7a8..9d2b97c 100644 --- a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiplatformConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiplatformConventionPlugin.kt @@ -1,21 +1,11 @@ package com.peto.droidmorning -import com.peto.droidmorning.extentions.libs -import com.peto.droidmorning.extentions.plugin import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.kotlin.dsl.apply -/** - * Kotlin Multiplatform 컨벤션 플러그인 - * 공통 KMP 설정을 중앙화합니다. - */ class KotlinMultiplatformConventionPlugin : Plugin { override fun apply(target: Project) = with(target) { - with(pluginManager) { - apply(libs.plugin("kotlin-multiplatform").pluginId) - } - apply() apply() apply() diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/extentions/ProjectExtensions.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/extentions/ProjectExtensions.kt index 51e8203..c6e841c 100644 --- a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/extentions/ProjectExtensions.kt +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/extentions/ProjectExtensions.kt @@ -26,10 +26,6 @@ internal val Project.androidExtension: CommonExtension<*, *, *, *, *, *> .onFailure { println("Could not find Library or Application extension from this project") } .getOrThrow() -internal fun Project.kotlin(action: KotlinMultiplatformExtension.() -> Unit) { - extensions.configure(action) -} - internal fun Project.composeMultiplatformDependencies() { extensions.configure { sourceSets.apply { diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/extentions/VersionCatalogExtensions.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/extentions/VersionCatalogExtensions.kt index 6d4f9b4..6db2847 100644 --- a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/extentions/VersionCatalogExtensions.kt +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/extentions/VersionCatalogExtensions.kt @@ -1,11 +1,8 @@ package com.peto.droidmorning.extentions -import org.gradle.api.Project import org.gradle.api.artifacts.ExternalModuleDependencyBundle import org.gradle.api.artifacts.MinimalExternalModuleDependency import org.gradle.api.artifacts.VersionCatalog -import org.gradle.api.artifacts.VersionCatalogsExtension -import org.gradle.kotlin.dsl.getByType import org.gradle.plugin.use.PluginDependency internal fun VersionCatalog.version(name: String): String { From 92e0444dcf79941adb0a84339e1dea51e6b45bfe Mon Sep 17 00:00:00 2001 From: chanho0908 Date: Tue, 20 Jan 2026 13:00:27 +0900 Subject: [PATCH 09/12] =?UTF-8?q?refactor:=20KMP=20=ED=94=8C=EB=9F=AC?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8/=EC=9E=90=EB=B0=94=20=ED=83=80=EA=B2=9F=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Firebender](https://firebender.com) Co-Authored-By: Firebender --- build-logic/convention/build.gradle.kts | 9 +++++---- .../AndroidLibraryConventionPlugin.kt | 9 +++++---- .../KotlinMultiPlatformAndroidPlugin.kt | 15 ++++++--------- .../droidmorning/KotlinMultiPlatformPlugin.kt | 9 ++------- .../KotlinMultiplatformConventionPlugin.kt | 4 ++++ .../extentions/VersionCatalogExtensions.kt | 10 ++++++++++ 6 files changed, 32 insertions(+), 24 deletions(-) diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index ad9fc4c..dc20cca 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -6,14 +6,16 @@ plugins { group = "com.peto.droidmorning.buildlogic" +val javaVersion = JavaVersion.toVersion(libs.versions.java.get()) + java { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 + sourceCompatibility = javaVersion + targetCompatibility = javaVersion } kotlin { compilerOptions { - jvmTarget = JvmTarget.JVM_11 + jvmTarget = JvmTarget.fromTarget(libs.versions.java.get()) } } @@ -21,7 +23,6 @@ dependencies { compileOnly(libs.android.gradle.plugin) compileOnly(libs.kotlin.gradle.plugin) compileOnly(libs.compose.gradle.plugin) - compileOnly(libs.compose.compiler.gradle.plugin) } gradlePlugin { diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/AndroidLibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/AndroidLibraryConventionPlugin.kt index f6c6f92..bf3c3d4 100644 --- a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/AndroidLibraryConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/AndroidLibraryConventionPlugin.kt @@ -1,9 +1,10 @@ package com.peto.droidmorning import com.android.build.gradle.LibraryExtension +import com.peto.droidmorning.extentions.javaVersion import com.peto.droidmorning.extentions.libs +import com.peto.droidmorning.extentions.plugin import com.peto.droidmorning.extentions.version -import org.gradle.api.JavaVersion import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.kotlin.dsl.configure @@ -12,7 +13,7 @@ class AndroidLibraryConventionPlugin : Plugin { override fun apply(target: Project) { with(target) { with(pluginManager) { - apply("com.android.library") + apply(libs.plugin("android-library").pluginId) } extensions.configure { @@ -23,8 +24,8 @@ class AndroidLibraryConventionPlugin : Plugin { } compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 + sourceCompatibility = libs.javaVersion("java") + targetCompatibility = libs.javaVersion("java") } buildFeatures { diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiPlatformAndroidPlugin.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiPlatformAndroidPlugin.kt index df9bcb2..a271d2c 100644 --- a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiPlatformAndroidPlugin.kt +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiPlatformAndroidPlugin.kt @@ -1,18 +1,15 @@ package com.peto.droidmorning import com.peto.droidmorning.extentions.androidExtension +import com.peto.droidmorning.extentions.javaVersion +import com.peto.droidmorning.extentions.jvmTarget import com.peto.droidmorning.extentions.libs import com.peto.droidmorning.extentions.version -import org.gradle.api.JavaVersion import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.kotlin.dsl.configure -import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension -/** - * Android 타겟 설정 플러그인 - */ class KotlinMultiPlatformAndroidPlugin : Plugin { override fun apply(target: Project): Unit = with(target) { androidExtension.apply { @@ -20,17 +17,17 @@ class KotlinMultiPlatformAndroidPlugin : Plugin { extensions.configure { androidTarget { - compilerOptions.jvmTarget.set(JvmTarget.JVM_11) + compilerOptions.jvmTarget.set(libs.jvmTarget("java")) } } defaultConfig { - minSdk = libs.findVersion("minSdk").get().requiredVersion.toInt() + minSdk = libs.version("minSdk").toInt() } compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 + sourceCompatibility = libs.javaVersion("java") + targetCompatibility = libs.javaVersion("java") } packaging { diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiPlatformPlugin.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiPlatformPlugin.kt index d1b2385..32d3ff3 100644 --- a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiPlatformPlugin.kt +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiPlatformPlugin.kt @@ -1,22 +1,17 @@ package com.peto.droidmorning +import com.peto.droidmorning.extentions.jvmTarget import com.peto.droidmorning.extentions.libs -import com.peto.droidmorning.extentions.plugin import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.kotlin.dsl.configure import org.gradle.kotlin.dsl.withType -import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.tasks.KotlinNativeLink class KotlinMultiPlatformPlugin : Plugin { override fun apply(target: Project) = with(target) { - with(pluginManager) { - apply(libs.plugin("kotlin-multiplatform").pluginId) - } - extensions.configure { compilerOptions { freeCompilerArgs.add("-Xexpect-actual-classes") @@ -27,7 +22,7 @@ class KotlinMultiPlatformPlugin : Plugin { tasks.withType().configureEach { compilerOptions { - jvmTarget.set(JvmTarget.JVM_11) + jvmTarget.set(libs.jvmTarget("java")) } } diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiplatformConventionPlugin.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiplatformConventionPlugin.kt index 9d2b97c..b38f1e5 100644 --- a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiplatformConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiplatformConventionPlugin.kt @@ -6,6 +6,10 @@ import org.gradle.kotlin.dsl.apply class KotlinMultiplatformConventionPlugin : Plugin { override fun apply(target: Project) = with(target) { + with(pluginManager) { + apply("org.jetbrains.kotlin.multiplatform") + } + apply() apply() apply() diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/extentions/VersionCatalogExtensions.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/extentions/VersionCatalogExtensions.kt index 6db2847..45ba9ee 100644 --- a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/extentions/VersionCatalogExtensions.kt +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/extentions/VersionCatalogExtensions.kt @@ -1,9 +1,11 @@ package com.peto.droidmorning.extentions +import org.gradle.api.JavaVersion import org.gradle.api.artifacts.ExternalModuleDependencyBundle import org.gradle.api.artifacts.MinimalExternalModuleDependency import org.gradle.api.artifacts.VersionCatalog import org.gradle.plugin.use.PluginDependency +import org.jetbrains.kotlin.gradle.dsl.JvmTarget internal fun VersionCatalog.version(name: String): String { return findVersion(name).get().requiredVersion @@ -20,3 +22,11 @@ internal fun VersionCatalog.plugin(name: String): PluginDependency { internal fun VersionCatalog.bundle(name: String): ExternalModuleDependencyBundle { return findBundle(name).get().get() } + +internal fun VersionCatalog.javaVersion(name: String): JavaVersion { + return JavaVersion.toVersion(version(name)) +} + +internal fun VersionCatalog.jvmTarget(name: String): JvmTarget { + return JvmTarget.fromTarget(version(name)) +} From cfced08d16caab0d3d1fe4c1843d924f2da378c3 Mon Sep 17 00:00:00 2001 From: chanho0908 Date: Tue, 20 Jan 2026 13:00:42 +0900 Subject: [PATCH 10/12] =?UTF-8?q?fix:=20compose=20debugImplementation=20?= =?UTF-8?q?=EA=B5=AC=EC=84=B1=20=EA=B0=80=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Firebender](https://firebender.com) Co-Authored-By: Firebender --- .../extentions/ProjectExtensions.kt | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/extentions/ProjectExtensions.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/extentions/ProjectExtensions.kt index c6e841c..a11adea 100644 --- a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/extentions/ProjectExtensions.kt +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/extentions/ProjectExtensions.kt @@ -7,24 +7,16 @@ import org.gradle.api.Project import org.gradle.api.artifacts.VersionCatalog import org.gradle.api.artifacts.VersionCatalogsExtension import org.gradle.kotlin.dsl.configure -import org.gradle.kotlin.dsl.dependencies import org.gradle.kotlin.dsl.getByType import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension internal val Project.libs: VersionCatalog get() = extensions.getByType().named("libs") -internal val Project.applicationExtension: CommonExtension<*, *, *, *, *, *> - get() = extensions.getByType() - -internal val Project.libraryExtension: CommonExtension<*, *, *, *, *, *> - get() = extensions.getByType() - internal val Project.androidExtension: CommonExtension<*, *, *, *, *, *> - get() = runCatching { libraryExtension } - .recoverCatching { applicationExtension } - .onFailure { println("Could not find Library or Application extension from this project") } - .getOrThrow() + get() = extensions.findByType(LibraryExtension::class.java) + ?: extensions.findByType(ApplicationExtension::class.java) + ?: error("Could not find Library or Application extension from this project") internal fun Project.composeMultiplatformDependencies() { extensions.configure { @@ -37,7 +29,7 @@ internal fun Project.composeMultiplatformDependencies() { } } - dependencies { - "debugImplementation"(libs.library("compose-ui-tooling")) + configurations.findByName("debugImplementation")?.let { cfg -> + dependencies.add(cfg.name, libs.library("compose-ui-tooling")) } } From 2cf2dfbba7175c48f9d66f33b49d91e81d42895e Mon Sep 17 00:00:00 2001 From: chanho0908 Date: Tue, 20 Jan 2026 13:00:57 +0900 Subject: [PATCH 11/12] =?UTF-8?q?chore:=20compose=20compiler=20=ED=94=8C?= =?UTF-8?q?=EB=9F=AC=EA=B7=B8=EC=9D=B8=20=EC=A0=95=EC=9D=98=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Firebender](https://firebender.com) Co-Authored-By: Firebender --- gradle/libs.versions.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index da53644..0bc1533 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -65,7 +65,6 @@ androidx-espresso = "3.7.0" android-gradle-plugin = { group = "com.android.tools.build", name = "gradle", version.ref = "agp" } kotlin-gradle-plugin = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin", version.ref = "kotlin" } compose-gradle-plugin = { group = "org.jetbrains.compose", name = "compose-gradle-plugin", version.ref = "compose-multiplatform" } -compose-compiler-gradle-plugin = { group = "org.jetbrains.kotlin", name = "compose-compiler-gradle-plugin", version.ref = "kotlin" } # AndroidX androidx-core-ktx = { module = "androidx.core:core-ktx", version.ref = "androidx-core-ktx" } From 24764a32aa15fa88fdfbdec257fbbe1de435b9b9 Mon Sep 17 00:00:00 2001 From: chanho0908 Date: Tue, 20 Jan 2026 13:09:03 +0900 Subject: [PATCH 12/12] =?UTF-8?q?chore:=20=EC=A3=BC=EC=84=9D=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../peto/droidmorning/ComposeMultiplatformConventionPlugin.kt | 4 ---- .../com/peto/droidmorning/KotlinMultiPlatformiOSPlugin.kt | 3 --- 2 files changed, 7 deletions(-) diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/ComposeMultiplatformConventionPlugin.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/ComposeMultiplatformConventionPlugin.kt index a96eaf7..54b8ecd 100644 --- a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/ComposeMultiplatformConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/ComposeMultiplatformConventionPlugin.kt @@ -6,10 +6,6 @@ import com.peto.droidmorning.extentions.plugin import org.gradle.api.Plugin import org.gradle.api.Project -/** - * Compose Multiplatform 컨벤션 플러그인 - * 공통 Compose Multiplatform 설정을 중앙화합니다. - */ class ComposeMultiplatformConventionPlugin : Plugin { override fun apply(target: Project) = with(target) { with(pluginManager) { diff --git a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiPlatformiOSPlugin.kt b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiPlatformiOSPlugin.kt index 6296d88..4925d23 100644 --- a/build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiPlatformiOSPlugin.kt +++ b/build-logic/convention/src/main/kotlin/com/peto/droidmorning/KotlinMultiPlatformiOSPlugin.kt @@ -8,9 +8,6 @@ import org.gradle.kotlin.dsl.withType import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget -/** - * iOS 타겟 설정 플러그인 - */ class KotlinMultiPlatformiOSPlugin : Plugin { override fun apply(target: Project) = with(target) { extensions.configure {