From 63b749ce5f782c2768905308cd4a4f57f63cf369 Mon Sep 17 00:00:00 2001 From: HaeTi Date: Tue, 5 Nov 2024 17:27:49 +0900 Subject: [PATCH] init/#1 : build-logic --- app/build.gradle.kts | 27 +-- build-logic/convention/build.gradle.kts | 51 ++++ .../convention/AndroidApplicationPlugin.kt | 36 +++ .../convention/AndroidComposePlugin.kt | 19 ++ .../convention/AndroidLibraryPlugin.kt | 29 +++ .../mapisode/convention/HiltPlugin.kt | 25 ++ .../mapisode/convention/MapisodeDataPlugin.kt | 30 +++ .../convention/MapisodeFeaturePlugin.kt | 26 +++ .../convention/extension/ComposeAndroid.kt | 25 ++ .../DependencyHandlerScopeExtension.kt | 55 +++++ .../convention/extension/KotlinAndroid.kt | 70 ++++++ .../convention/extension/KotlinCoroutine.kt | 15 ++ .../convention/extension/ProjectExtension.kt | 9 + .../extension/VersionCatalogExtension.kt | 25 ++ build-logic/gradle.properties | 3 + build-logic/settings.gradle.kts | 16 ++ build.gradle.kts | 6 + gradle/libs.versions.toml | 217 ++++++++++++++++-- 18 files changed, 643 insertions(+), 41 deletions(-) create mode 100644 build-logic/convention/build.gradle.kts create mode 100644 build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/AndroidApplicationPlugin.kt create mode 100644 build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/AndroidComposePlugin.kt create mode 100644 build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/AndroidLibraryPlugin.kt create mode 100644 build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/HiltPlugin.kt create mode 100644 build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/MapisodeDataPlugin.kt create mode 100644 build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/MapisodeFeaturePlugin.kt create mode 100644 build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/extension/ComposeAndroid.kt create mode 100644 build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/extension/DependencyHandlerScopeExtension.kt create mode 100644 build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/extension/KotlinAndroid.kt create mode 100644 build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/extension/KotlinCoroutine.kt create mode 100644 build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/extension/ProjectExtension.kt create mode 100644 build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/extension/VersionCatalogExtension.kt create mode 100644 build-logic/gradle.properties create mode 100644 build-logic/settings.gradle.kts diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 023d9166..09bb0879 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,6 +1,7 @@ plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.android) + alias(libs.plugins.compose.compiler) } android { @@ -30,18 +31,15 @@ android { } } compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } kotlinOptions { - jvmTarget = "1.8" + jvmTarget = "17" } buildFeatures { compose = true } - composeOptions { - kotlinCompilerExtensionVersion = "1.5.1" - } packaging { resources { excludes += "/META-INF/{AL2.0,LGPL2.1}" @@ -50,20 +48,7 @@ android { } dependencies { + implementation(libs.bundles.compose) + implementation(libs.bundles.androidx.core) - implementation(libs.androidx.core.ktx) - implementation(libs.androidx.lifecycle.runtime.ktx) - implementation(libs.androidx.activity.compose) - implementation(platform(libs.androidx.compose.bom)) - implementation(libs.androidx.ui) - implementation(libs.androidx.ui.graphics) - implementation(libs.androidx.ui.tooling.preview) - implementation(libs.androidx.material3) - testImplementation(libs.junit) - androidTestImplementation(libs.androidx.junit) - androidTestImplementation(libs.androidx.espresso.core) - androidTestImplementation(platform(libs.androidx.compose.bom)) - androidTestImplementation(libs.androidx.ui.test.junit4) - debugImplementation(libs.androidx.ui.tooling) - debugImplementation(libs.androidx.ui.test.manifest) } \ No newline at end of file diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts new file mode 100644 index 00000000..ff1c7005 --- /dev/null +++ b/build-logic/convention/build.gradle.kts @@ -0,0 +1,51 @@ +plugins { + `kotlin-dsl` +} + +group = "com.boostcamp.mapisode.convention" + +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +dependencies { + compileOnly(libs.android.gradlePlugin) + compileOnly(libs.kotlin.gradlePlugin) + compileOnly(libs.compose.compiler.gradlePlugin) + compileOnly(libs.ksp.gradlePlugin) +} + +gradlePlugin { + plugins { + register("androidApplication") { + id = "mapisode.android.application" + implementationClass = "AndroidApplicationPlugin" + } + + register("androidLibrary") { + id = "mapisode.android.library" + implementationClass = "AndroidLibraryPlugin" + } + + register("androidCompose") { + id = "mapisode.android.compose" + implementationClass = "AndroidComposePlugin" + } + + register("androidHilt") { + id = "mapisode.android.hilt" + implementationClass = "HiltPlugin" + } + + register("feature") { + id = "mapisode.feature" + implementationClass = "MapisodeFeaturePlugin" + } + + register("data") { + id = "mapisode.data" + implementationClass = "MapisodeDataPlugin" + } + } +} diff --git a/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/AndroidApplicationPlugin.kt b/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/AndroidApplicationPlugin.kt new file mode 100644 index 00000000..cf99828f --- /dev/null +++ b/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/AndroidApplicationPlugin.kt @@ -0,0 +1,36 @@ +package com.boostcamp.mapisode.convention + +import com.android.build.api.dsl.ApplicationExtension +import com.boostcamp.mapisode.convention.extension.configureComposeAndroid +import com.boostcamp.mapisode.convention.extension.configureKotlinAndroid +import com.boostcamp.mapisode.convention.extension.getLibrary +import com.boostcamp.mapisode.convention.extension.getVersion +import com.boostcamp.mapisode.convention.extension.implementation +import com.boostcamp.mapisode.convention.extension.libs +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.dependencies + +class AndroidApplicationPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + pluginManager.apply("com.android.application") + + extensions.configure { + configureKotlinAndroid(this) + configureComposeAndroid(this) + + with(defaultConfig) { + targetSdk = libs.getVersion("targetSdk").requiredVersion.toInt() + versionCode = libs.getVersion("versionCode").requiredVersion.toInt() + versionName = libs.getVersion("versionName").requiredVersion + } + + dependencies { + implementation(libs.getLibrary("timber")) + } + } + } + } +} diff --git a/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/AndroidComposePlugin.kt b/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/AndroidComposePlugin.kt new file mode 100644 index 00000000..54c4f6e3 --- /dev/null +++ b/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/AndroidComposePlugin.kt @@ -0,0 +1,19 @@ +package com.boostcamp.mapisode.convention + +import com.android.build.gradle.LibraryExtension +import com.boostcamp.mapisode.convention.extension.configureComposeAndroid +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure + +class AndroidComposePlugin : Plugin { + override fun apply(target: Project) { + with(target) { + pluginManager.apply("mapisode.android.compose") + + extensions.configure { + configureComposeAndroid(this) + } + } + } +} diff --git a/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/AndroidLibraryPlugin.kt b/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/AndroidLibraryPlugin.kt new file mode 100644 index 00000000..6f4b1806 --- /dev/null +++ b/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/AndroidLibraryPlugin.kt @@ -0,0 +1,29 @@ +package com.boostcamp.mapisode.convention + +import com.android.build.gradle.LibraryExtension +import com.boostcamp.mapisode.convention.extension.configureKotlinAndroid +import com.boostcamp.mapisode.convention.extension.configureKotlinCoroutine +import com.boostcamp.mapisode.convention.extension.getLibrary +import com.boostcamp.mapisode.convention.extension.implementation +import com.boostcamp.mapisode.convention.extension.libs +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.dependencies + +class AndroidLibraryPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + pluginManager.apply("com.android.library") + + extensions.configure { + configureKotlinAndroid(this) + configureKotlinCoroutine(this) + } + + dependencies { + implementation(libs.getLibrary("timber")) + } + } + } +} diff --git a/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/HiltPlugin.kt b/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/HiltPlugin.kt new file mode 100644 index 00000000..b2bd95df --- /dev/null +++ b/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/HiltPlugin.kt @@ -0,0 +1,25 @@ +package com.boostcamp.mapisode.convention + +import com.boostcamp.mapisode.convention.extension.getLibrary +import com.boostcamp.mapisode.convention.extension.implementation +import com.boostcamp.mapisode.convention.extension.ksp +import com.boostcamp.mapisode.convention.extension.libs +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.dependencies + +class HiltPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + pluginManager.apply { + apply("dagger.hilt.android.plugin") + apply("com.google.devtools.ksp") + } + + dependencies { + implementation(libs.getLibrary("hilt-android")) + ksp(libs.getLibrary("hilt-android-compiler")) + } + } + } +} diff --git a/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/MapisodeDataPlugin.kt b/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/MapisodeDataPlugin.kt new file mode 100644 index 00000000..8218343e --- /dev/null +++ b/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/MapisodeDataPlugin.kt @@ -0,0 +1,30 @@ +package com.boostcamp.mapisode.convention + +import com.boostcamp.mapisode.convention.extension.getBundle +import com.boostcamp.mapisode.convention.extension.getLibrary +import com.boostcamp.mapisode.convention.extension.implementation +import com.boostcamp.mapisode.convention.extension.libs +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.dependencies + +class MapisodeDataPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + pluginManager.apply { + apply("mapisode.android.library") + apply("mapisode.android.hilt") + apply("org.jetbrains.kotlin.plugin.serialization") + } + + dependencies { + val retrofitBom = libs.getLibrary("retrofit-bom") + implementation(platform(retrofitBom)) + implementation(project(":core:model")) + implementation(project(":core:network")) + implementation(libs.getLibrary("kotlinx-serialization")) + implementation(libs.getBundle("retrofit")) + } + } + } +} diff --git a/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/MapisodeFeaturePlugin.kt b/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/MapisodeFeaturePlugin.kt new file mode 100644 index 00000000..c0fd4bb9 --- /dev/null +++ b/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/MapisodeFeaturePlugin.kt @@ -0,0 +1,26 @@ +package com.boostcamp.mapisode.convention + +import com.boostcamp.mapisode.convention.extension.getBundle +import com.boostcamp.mapisode.convention.extension.implementation +import com.boostcamp.mapisode.convention.extension.libs +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.dependencies + +class MapisodeFeaturePlugin : Plugin { + override fun apply(target: Project) { + with(target) { + pluginManager.apply { + apply("mapisode.android.library") + apply("mapisode.android.compose") + } + + dependencies { + implementation(project(":core:ui")) + implementation(project(":core:designsystem")) + implementation(project(":core:model")) + implementation(libs.getBundle("compose")) + } + } + } +} diff --git a/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/extension/ComposeAndroid.kt b/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/extension/ComposeAndroid.kt new file mode 100644 index 00000000..bf27424c --- /dev/null +++ b/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/extension/ComposeAndroid.kt @@ -0,0 +1,25 @@ +package com.boostcamp.mapisode.convention.extension + +import com.android.build.api.dsl.CommonExtension +import org.gradle.api.Project +import org.gradle.kotlin.dsl.dependencies + +internal fun Project.configureComposeAndroid( + commonExtension: CommonExtension<*, *, *, *, *, *>, +) { + pluginManager.apply("org.jetbrains.kotlin.plugin.compose") + + commonExtension.apply { + buildFeatures { + compose = true + } + + dependencies { + val composeBom = libs.getLibrary("compose-bom") + implementation(platform(composeBom)) + implementation(libs.getBundle("compose")) + debugImplementation(libs.getBundle("compose-debug")) + // TODO: Test 의존성 추가 + } + } +} diff --git a/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/extension/DependencyHandlerScopeExtension.kt b/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/extension/DependencyHandlerScopeExtension.kt new file mode 100644 index 00000000..39874e95 --- /dev/null +++ b/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/extension/DependencyHandlerScopeExtension.kt @@ -0,0 +1,55 @@ +package com.boostcamp.mapisode.convention.extension + +import org.gradle.api.Project +import org.gradle.api.file.ConfigurableFileCollection +import org.gradle.api.file.ConfigurableFileTree +import org.gradle.api.provider.Provider +import org.gradle.kotlin.dsl.DependencyHandlerScope + +fun DependencyHandlerScope.implementation(project: Project) { + "implementation"(project) +} + +fun DependencyHandlerScope.implementation(provider: Provider<*>) { + "implementation"(provider) +} + +fun DependencyHandlerScope.implementation(fileTree: ConfigurableFileTree) { + "implementation"(fileTree) +} + +fun DependencyHandlerScope.implementation(fileCollection: ConfigurableFileCollection) { + "implementation"(fileCollection) +} + +fun DependencyHandlerScope.debugImplementation(provider: Provider<*>) { + "debugImplementation"(provider) +} + +fun DependencyHandlerScope.releaseImplementation(provider: Provider<*>) { + "releaseImplementation"(provider) +} + +fun DependencyHandlerScope.ksp(provider: Provider<*>) { + "ksp"(provider) +} + +fun DependencyHandlerScope.kspTest(provider: Provider<*>) { + "kspTest"(provider) +} + +fun DependencyHandlerScope.coreLibraryDesugaring(provider: Provider<*>) { + "coreLibraryDesugaring"(provider) +} + +fun DependencyHandlerScope.androidTestImplementation(provider: Provider<*>) { + "androidTestImplementation"(provider) +} + +fun DependencyHandlerScope.testImplementation(provider: Provider<*>) { + "testImplementation"(provider) +} + +fun DependencyHandlerScope.compileOnly(provider: Provider<*>) { + "compileOnly"(provider) +} \ No newline at end of file diff --git a/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/extension/KotlinAndroid.kt b/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/extension/KotlinAndroid.kt new file mode 100644 index 00000000..e13a8512 --- /dev/null +++ b/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/extension/KotlinAndroid.kt @@ -0,0 +1,70 @@ +package com.boostcamp.mapisode.convention.extension + +import com.android.build.api.dsl.CommonExtension +import org.gradle.api.JavaVersion +import org.gradle.api.Project +import org.gradle.kotlin.dsl.provideDelegate +import org.gradle.kotlin.dsl.withType +import org.jetbrains.kotlin.gradle.dsl.JvmTarget +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +internal fun Project.configureKotlinAndroid( + commonExtension: CommonExtension<*, *, *, *, *, *>, +) { + pluginManager.apply("org.jetbrains.kotlin.android") + + commonExtension.apply { + compileSdk = libs.getVersion("compileSdk").requiredVersion.toInt() + + defaultConfig { + minSdk = libs.getVersion("minSdk").requiredVersion.toInt() + + vectorDrawables.useSupportLibrary = true + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + isCoreLibraryDesugaringEnabled = true + } + + buildTypes { + getByName("debug") { + proguardFiles( + getDefaultProguardFile("proguard-android.txt"), + "proguard-debug.pro", + ) + } + + getByName("release") { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android.txt"), + "proguard-rules.pro", + ) + } + } + + lint { + abortOnError = false + } + + tasks.withType().configureEach { + compilerOptions { + jvmTarget.set(JvmTarget.JVM_17) + + val warningsAsErrors: String? by project + allWarningsAsErrors.set(warningsAsErrors.toBoolean()) + + freeCompilerArgs.addAll( + listOf( + "-opt-in=kotlin.RequiresOptIn", + "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi", + "-opt-in=androidx.compose.material3.ExperimentalMaterial3Api", + "-opt-in=androidx.lifecycle.compose.ExperimentalLifecycleComposeApi", + ) + ) + } + } + } +} diff --git a/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/extension/KotlinCoroutine.kt b/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/extension/KotlinCoroutine.kt new file mode 100644 index 00000000..0a90ed11 --- /dev/null +++ b/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/extension/KotlinCoroutine.kt @@ -0,0 +1,15 @@ +package com.boostcamp.mapisode.convention.extension + +import com.android.build.api.dsl.CommonExtension +import org.gradle.api.Project +import org.gradle.kotlin.dsl.dependencies + +internal fun Project.configureKotlinCoroutine( + commonExtension: CommonExtension<*, *, *, *, *, *>, +) { + commonExtension.apply { + dependencies { + implementation(libs.getBundle("coroutines")) + } + } +} diff --git a/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/extension/ProjectExtension.kt b/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/extension/ProjectExtension.kt new file mode 100644 index 00000000..22114e44 --- /dev/null +++ b/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/extension/ProjectExtension.kt @@ -0,0 +1,9 @@ +package com.boostcamp.mapisode.convention.extension + +import org.gradle.api.Project +import org.gradle.api.artifacts.VersionCatalog +import org.gradle.api.artifacts.VersionCatalogsExtension +import org.gradle.kotlin.dsl.getByType + +val Project.libs: VersionCatalog + get() = extensions.getByType().named("libs") diff --git a/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/extension/VersionCatalogExtension.kt b/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/extension/VersionCatalogExtension.kt new file mode 100644 index 00000000..8eb90202 --- /dev/null +++ b/build-logic/convention/src/main/java/com/boostcamp/mapisode/convention/extension/VersionCatalogExtension.kt @@ -0,0 +1,25 @@ +package com.boostcamp.mapisode.convention.extension + +import org.gradle.api.artifacts.ExternalModuleDependencyBundle +import org.gradle.api.artifacts.MinimalExternalModuleDependency +import org.gradle.api.artifacts.VersionCatalog +import org.gradle.api.artifacts.VersionConstraint +import org.gradle.api.provider.Provider + +fun VersionCatalog.getBundle(bundleName: String): Provider { + return findBundle(bundleName).orElseThrow { + NoSuchElementException("Bundle with name $bundleName not found in the catalog") + } +} + +fun VersionCatalog.getLibrary(libraryName: String): Provider { + return findLibrary(libraryName).orElseThrow { + NoSuchElementException("Library with name $libraryName not found in the catalog") + } +} + +fun VersionCatalog.getVersion(versionName: String): VersionConstraint { + return findVersion(versionName).orElseThrow { + NoSuchElementException("Version with name $versionName not found in the catalog") + } +} diff --git a/build-logic/gradle.properties b/build-logic/gradle.properties new file mode 100644 index 00000000..6977b719 --- /dev/null +++ b/build-logic/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.parallel=true +org.gradle.caching=true +org.gradle.configureondemand=true \ No newline at end of file diff --git a/build-logic/settings.gradle.kts b/build-logic/settings.gradle.kts new file mode 100644 index 00000000..fd968aff --- /dev/null +++ b/build-logic/settings.gradle.kts @@ -0,0 +1,16 @@ +enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") + +dependencyResolutionManagement { + repositories { + google() + mavenCentral() + } + versionCatalogs { + create("libs") { + from(files("../gradle/libs.versions.toml")) + } + } +} + +rootProject.name = "build-logic" +include(":convention") \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 922f5511..c1c034ae 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,4 +2,10 @@ plugins { alias(libs.plugins.android.application) apply false alias(libs.plugins.kotlin.android) apply false + alias(libs.plugins.kotlin.jvm) apply false + alias(libs.plugins.kotlin.serialization) apply false + alias(libs.plugins.compose.compiler) apply false + alias(libs.plugins.hilt) apply false + alias(libs.plugins.ksp) apply false + alias(libs.plugins.android.library) apply false } \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 68b1086e..0c8b4f2e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,31 +1,208 @@ [versions] +# SDK Versions +compileSdk = "34" +minSdk = "28" +targetSdk = "34" + +# App Version +versionName = "1.0.0" +versionCode = "10000" + +# Build Tools agp = "8.6.0-rc01" -kotlin = "1.9.0" -coreKtx = "1.13.1" + +# AndroidX +androidx-core-ktx = "1.13.1" +androidx-appcompat = "1.7.0" +androidx-activity-ktx = "1.9.0" +androidx-activity-compose = "1.9.3" +androidx-lifecycle = "2.8.3" +androidx-lifecycle-runtime-ktx = "2.8.7" +androidx-hilt-navigation-compose = "1.2.0" + +# Compose +compose-bom = "2024.10.01" +compose-navigation = "2.8.3" +compose-material3 = "1.2.1" + +# Coil +coil = "3.0.0-rc02" + +# Hilt +hilt = "2.48.1" + +# Kotlin +kotlin = "2.0.21" +kotlin-jvm = "17" +kotlinx-serialization-json = "1.7.3" +kotlinx-serialization-converter = "1.0.0" +kotlinx-coroutines = "1.9.0" +kotlinx-immutable = "0.3.8" + +## Ksp +ksp = "2.0.21-1.0.25" + +# Network +okhttp = "4.12.0" +retrofit = "2.11.0" + +# Timber +timber = "5.0.1" + +# Test junit = "4.13.2" -junitVersion = "1.2.1" -espressoCore = "3.6.1" -lifecycleRuntimeKtx = "2.8.6" -activityCompose = "1.9.3" -composeBom = "2024.04.01" +androidx-junit = "1.2.1" +espresso-core = "3.6.1" +material = "1.12.0" [libraries] -androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } +# Androidx Core +androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "androidx-core-ktx" } +androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "androidx-appcompat" } +androidx-activity-ktx = { group = "androidx.activity", name = "activity-ktx", version.ref = "androidx-activity-ktx" } +androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "androidx-activity-compose" } +androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "androidx-lifecycle-runtime-ktx" } +androidx-lifecycle-viewmodel-ktx = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-ktx", version.ref = "androidx-lifecycle" } +androidx-lifecycle-viewmodel-compose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "androidx-lifecycle" } + +# Coil +coil-compose = { group = "io.coil-kt", name = "coil-compose", version.ref = "coil" } +coil-network-okhttp = { group = "io.coil-kt", name = "coil-network-okhttp", version.ref = "coil" } + +# Compose +compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "compose-bom" } +compose-ui = { group = "androidx.compose.ui", name = "ui" } +compose-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" } +compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } +compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } +compose-material = { group = "androidx.compose.material", name = "material" } +compose-material3 = { group = "androidx.compose.material3", name = "material3", version.ref = "compose-material3" } +compose-navigation = { group = "androidx.navigation", name = "navigation-compose", version.ref = "compose-navigation" } +compose-hilt-navigation = { group = "androidx.hilt", name = "hilt-navigation-compose", version.ref = "androidx-hilt-navigation-compose" } +compose-foundation = { group = "androidx.compose.foundation", name = "foundation" } +compose-runtime = { group = "androidx.compose.runtime", name = "runtime" } +compose-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } +compose-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } + +# Hilt +hilt-android = { group = "com.google.dagger", name = "hilt-android", version.ref = "hilt" } +hilt-android-compiler = { group = "com.google.dagger", name = "hilt-android-compiler", version.ref = "hilt" } +hilt-core = { group = "com.google.dagger", name = "hilt-core", version.ref = "hilt" } +hilt-compiler = { group = "com.google.dagger", name = "hilt-compiler", version.ref = "hilt" } + +# Kotlin +kotlin-stdlib = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib", version.ref = "kotlin" } +kotlin-reflect = { group = "org.jetbrains.kotlin", name = "kotlin-reflect", version.ref = "kotlin" } +kotlinx-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinx-serialization-json" } +kotlinx-serialization-convertor = { group = "com.jakewharton.retrofit", name = "retrofit2-kotlinx-serialization-converter", version.ref = "kotlinx-serialization-converter" } +kotlinx-coroutines-core = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core", version.ref = "kotlinx-coroutines" } +kotlinx-coroutines-android = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version.ref = "kotlinx-coroutines" } +kotlinx-immutable = { group = "org.jetbrains.kotlinx", name = "kotlinx-collections-immutable", version.ref = "kotlinx-immutable" } + +# Network +okhttp-bom = { group = "com.squareup.okhttp3", name = "okhttp-bom", version.ref = "okhttp" } +okhttp = { group = "com.squareup.okhttp3", name = "okhttp" } +okhttp-loging-interceptor = { group = "com.squareup.okhttp3", name = "logging-interceptor" } +retrofit-bom = { group = "com.squareup.retrofit2", name = "retrofit-bom", version.ref = "retrofit" } +retrofit = { group = "com.squareup.retrofit2", name = "retrofit" } +retrofit-kotlinx-serialization = { group = "com.squareup.retrofit2", name = "converter-kotlinx-serialization" } + +# Timber +timber = { group = "com.jakewharton.timber", name = "timber", version.ref = "timber" } + +# Test Libraries junit = { group = "junit", name = "junit", version.ref = "junit" } -androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } -androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } -androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" } -androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" } -androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" } -androidx-ui = { group = "androidx.compose.ui", name = "ui" } -androidx-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" } -androidx-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } -androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } -androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } -androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } -androidx-material3 = { group = "androidx.compose.material3", name = "material3" } +androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "androidx-junit" } +espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espresso-core" } + +# Dependencies of the included build-logic +android-gradlePlugin = { group = "com.android.tools.build", name = "gradle", version.ref = "agp" } +kotlin-gradlePlugin = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin", version.ref = "kotlin" } +compose-compiler-gradlePlugin = { group = "org.jetbrains.kotlin", name = "compose-compiler-gradle-plugin", version.ref = "kotlin" } +ksp-gradlePlugin = { group = "com.google.devtools.ksp", name = "com.google.devtools.ksp.gradle.plugin", version.ref = "ksp" } +hilt-gradlePlugin = { group = "com.google.dagger", name = "hilt-android-gradle-plugin", version.ref = "hilt" } +material = { group = "com.google.android.material", name = "material", version.ref = "material" } + +[bundles] +# AndroidX Core Libraries +androidx-core = [ + "androidx-core-ktx", + "androidx-appcompat", + "androidx-activity-ktx", + "androidx-lifecycle-runtime-ktx", + "androidx-lifecycle-viewmodel-ktx", +] + +# Compose Libraries +compose = [ + "compose-ui", + "compose-ui-graphics", + "compose-ui-tooling-preview", + "compose-material", + "compose-material3", + "compose-foundation", + "compose-runtime", + "androidx-activity-compose", + "androidx-lifecycle-viewmodel-compose", +] + +compose-debug = [ + "compose-ui-tooling", + "compose-ui-test-manifest" +] + +# Coroutines Libraries +coroutines = [ + "kotlinx-coroutines-core", + "kotlinx-coroutines-android", +] + +# Coil Libraries +coil = [ + "coil-compose", + "coil-network-okhttp" +] + +# Navigation +navigation = [ + "compose-navigation", + "compose-hilt-navigation" +] + +# Network Libraries +retrofit = [ + "retrofit-kotlinx-serialization", + "retrofit" +] + +okhttp = [ + "okhttp", + "okhttp-loging-interceptor" +] + +# Test Libraries +test = [ + "junit", + "androidx-junit", + "espresso-core", + "compose-ui-test-junit4", + "compose-ui-test-manifest", +] [plugins] android-application = { id = "com.android.application", version.ref = "agp" } +android-library = { id = "com.android.library", version.ref = "agp" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } +kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } +ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } +compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } +hilt = { id = "com.google.dagger.hilt.android", version.ref = "hilt" } +# Custom Plugins (Build Logic) +mapisode-android-application = { id = "mapisode.android.application", version = "unspecified" } +mapisode-android-library = { id = "mapisode.android.library", version = "unspecified" } +mapisode-android-compose = { id = "mapisode.android.compose", version = "unspecified" } +mapisode-android-hilt = { id = "mapisode.android.hilt", version = "unspecified" } +mapisode-feature = { id = "mapisode.feature", version = "unspecified" } +mapisode-data = { id = "mapisode.data", version = "unspecified" }