Skip to content

Commit 072ab24

Browse files
authored
Merge pull request #1 from Nexters/feature/build-logic-application
Gradle 빌드 로직을 모듈화하고 Convention Plugin을 추가합니다.
2 parents 5a02929 + 8c365a2 commit 072ab24

File tree

13 files changed

+324
-75
lines changed

13 files changed

+324
-75
lines changed

app/build.gradle.kts

Lines changed: 5 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,15 @@
11
plugins {
2-
alias(libs.plugins.android.application)
3-
alias(libs.plugins.kotlin.android)
4-
alias(libs.plugins.kotlin.compose)
2+
alias(libs.plugins.com.android.application)
3+
alias(libs.plugins.org.jetbrains.kotlin.android)
4+
alias(libs.plugins.jetpack.compose.compiler)
5+
alias(libs.plugins.tuk.android.application)
6+
alias(libs.plugins.tuk.android.application.compose)
57
}
68

79
android {
810
namespace = "com.plottwist.tuk"
9-
compileSdk = 36
10-
11-
defaultConfig {
12-
applicationId = "com.plottwist.tuk"
13-
minSdk = 26
14-
targetSdk = 36
15-
versionCode = 1
16-
versionName = "1.0"
17-
18-
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
19-
}
20-
21-
buildTypes {
22-
release {
23-
isMinifyEnabled = false
24-
proguardFiles(
25-
getDefaultProguardFile("proguard-android-optimize.txt"),
26-
"proguard-rules.pro"
27-
)
28-
}
29-
}
30-
compileOptions {
31-
sourceCompatibility = JavaVersion.VERSION_11
32-
targetCompatibility = JavaVersion.VERSION_11
33-
}
34-
kotlinOptions {
35-
jvmTarget = "11"
36-
}
37-
buildFeatures {
38-
compose = true
39-
}
4011
}
4112

4213
dependencies {
43-
44-
implementation(libs.androidx.core.ktx)
45-
implementation(libs.androidx.lifecycle.runtime.ktx)
46-
implementation(libs.androidx.activity.compose)
47-
implementation(platform(libs.androidx.compose.bom))
48-
implementation(libs.androidx.ui)
49-
implementation(libs.androidx.ui.graphics)
50-
implementation(libs.androidx.ui.tooling.preview)
51-
implementation(libs.androidx.material3)
5214
testImplementation(libs.junit)
53-
androidTestImplementation(libs.androidx.junit)
54-
androidTestImplementation(libs.androidx.espresso.core)
55-
androidTestImplementation(platform(libs.androidx.compose.bom))
56-
androidTestImplementation(libs.androidx.ui.test.junit4)
57-
debugImplementation(libs.androidx.ui.tooling)
58-
debugImplementation(libs.androidx.ui.test.manifest)
5915
}

build-logic/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/build
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
plugins {
2+
`kotlin-dsl`
3+
}
4+
5+
dependencies {
6+
compileOnly(libs.android.gradle.plugin)
7+
compileOnly(libs.kotlin.gradle.plugin)
8+
}
9+
10+
gradlePlugin {
11+
plugins {
12+
register("androidApplicationConventionPlugin") {
13+
id = "tuk.android.application"
14+
implementationClass = "AndroidApplicationConventionPlugin"
15+
}
16+
register("androidApplicationComposeConventionPlugin") {
17+
id = "tuk.android.application.compose"
18+
implementationClass = "AndroidApplicationComposeConventionPlugin"
19+
}
20+
}
21+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import com.android.build.api.dsl.ApplicationExtension
2+
import com.plottwist.tuk.configureAndroidCompose
3+
import com.plottwist.tuk.libs
4+
import org.gradle.api.Plugin
5+
import org.gradle.api.Project
6+
import org.gradle.kotlin.dsl.configure
7+
import org.gradle.kotlin.dsl.dependencies
8+
9+
class AndroidApplicationComposeConventionPlugin: Plugin<Project> {
10+
override fun apply(project: Project) {
11+
with(project) {
12+
project.pluginManager.apply("com.android.application")
13+
14+
extensions.configure<ApplicationExtension> {
15+
configureAndroidCompose(this)
16+
17+
dependencies {
18+
add("implementation", libs.findLibrary("activity.compose").get())
19+
}
20+
}
21+
}
22+
}
23+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import com.android.build.api.dsl.ApplicationExtension
2+
import com.plottwist.tuk.configureKotlinAndroid
3+
import com.plottwist.tuk.configurePackaging
4+
import com.plottwist.tuk.configureDefaultConfig
5+
import org.gradle.api.Plugin
6+
import org.gradle.api.Project
7+
import org.gradle.kotlin.dsl.configure
8+
9+
class AndroidApplicationConventionPlugin: Plugin<Project> {
10+
override fun apply(project: Project) {
11+
with(project) {
12+
with(project.pluginManager) {
13+
apply("com.android.application")
14+
apply("org.jetbrains.kotlin.android")
15+
}
16+
17+
extensions.configure<ApplicationExtension> {
18+
configureKotlinAndroid(this)
19+
configureDefaultConfig()
20+
configurePackaging()
21+
22+
buildFeatures {
23+
buildConfig = true
24+
}
25+
26+
buildTypes {
27+
getByName("release") {
28+
proguardFiles(
29+
getDefaultProguardFile("proguard-android-optimize.txt"),
30+
"proguard-rules.pro"
31+
)
32+
}
33+
}
34+
}
35+
}
36+
}
37+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.plottwist.tuk
2+
3+
import com.android.build.api.dsl.CommonExtension
4+
import org.gradle.api.Project
5+
import org.gradle.kotlin.dsl.dependencies
6+
7+
internal fun Project.configureAndroidCompose (
8+
commonExtension: CommonExtension<*, *, *, *, *, *>,
9+
) {
10+
with(plugins) {
11+
apply("org.jetbrains.kotlin.plugin.compose")
12+
}
13+
14+
commonExtension.apply {
15+
buildFeatures {
16+
compose = true
17+
}
18+
}
19+
20+
dependencies {
21+
val composeBom = libs.findLibrary("compose.bom").get()
22+
add("implementation", platform(composeBom))
23+
add("implementation", libs.findLibrary("ui").get())
24+
add("implementation", libs.findLibrary("ui.tooling.preview").get())
25+
add("implementation", libs.findLibrary("material3").get())
26+
add("implementation", libs.findLibrary("ui.graphics").get())
27+
add("debugImplementation", libs.findLibrary("ui.tooling").get())
28+
add("debugImplementation", libs.findLibrary("ui.test.manifest").get())
29+
add("androidTestImplementation", platform(composeBom))
30+
add("androidTestImplementation", libs.findLibrary("ui.test.junit4").get())
31+
}
32+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.plottwist.tuk
2+
3+
import com.android.build.api.dsl.ApplicationExtension
4+
import com.android.build.api.dsl.CommonExtension
5+
import org.gradle.api.JavaVersion
6+
import org.gradle.api.Project
7+
import org.gradle.api.artifacts.VersionCatalogsExtension
8+
import org.gradle.kotlin.dsl.getByType
9+
10+
fun ApplicationExtension.configureDefaultConfig() {
11+
defaultConfig {
12+
applicationId = "com.plottwist.tuk"
13+
targetSdk = 36
14+
versionCode = 1
15+
versionName = "1.0"
16+
17+
vectorDrawables {
18+
useSupportLibrary = true
19+
}
20+
}
21+
}
22+
23+
fun CommonExtension<*, *, *, *, *, *>.configurePackaging() {
24+
packaging {
25+
resources {
26+
excludes += "/META-INF/{AL2.0,LGPL2.1}"
27+
}
28+
}
29+
}
30+
31+
fun CommonExtension<*, *, *, *, *, *>.configureJavaCompatibility() {
32+
compileOptions {
33+
sourceCompatibility = JavaVersion.VERSION_18
34+
targetCompatibility = JavaVersion.VERSION_18
35+
}
36+
}
37+
38+
val Project.libs
39+
get() = extensions.getByType<VersionCatalogsExtension>().named("libs")
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.plottwist.tuk
2+
3+
import com.android.build.api.dsl.CommonExtension
4+
import org.gradle.api.JavaVersion
5+
import org.gradle.api.Project
6+
import org.gradle.kotlin.dsl.withType
7+
import org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_18
8+
import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile
9+
10+
internal fun Project.configureKotlinAndroid(
11+
commonExtension: CommonExtension<*, *, *, * ,*, *>
12+
) {
13+
commonExtension.apply {
14+
compileSdk = 36
15+
16+
defaultConfig {
17+
minSdk = 26
18+
19+
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
20+
}
21+
22+
configureJavaCompatibility()
23+
24+
configureKotlin()
25+
}
26+
}
27+
28+
private fun Project.configureKotlin() {
29+
tasks.withType<KotlinJvmCompile>().configureEach {
30+
compilerOptions {
31+
jvmTarget.set(JVM_18)
32+
}
33+
}
34+
}

build-logic/settings.gradle.kts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
dependencyResolutionManagement {
2+
repositories {
3+
google()
4+
mavenCentral()
5+
}
6+
versionCatalogs {
7+
create("libs") {
8+
from(files("../gradle/libs.versions.toml"))
9+
}
10+
}
11+
}
12+
13+
rootProject.name = "build-logic"
14+
include(":convention")

build.gradle.kts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
// Top-level build file where you can add configuration options common to all sub-projects/modules.
22
plugins {
3-
alias(libs.plugins.android.application) apply false
4-
alias(libs.plugins.kotlin.android) apply false
5-
alias(libs.plugins.kotlin.compose) apply false
3+
alias(libs.plugins.com.android.application) apply false
4+
alias(libs.plugins.org.jetbrains.kotlin.android) apply false
5+
alias(libs.plugins.com.android.library) apply false
6+
alias(libs.plugins.hilt) apply false
7+
alias(libs.plugins.kotlinx.serialization.plugin) apply false
8+
alias(libs.plugins.android.juni5) apply false
9+
alias(libs.plugins.jetpack.compose.compiler) apply false
10+
alias(libs.plugins.jetbrains.kotlin.jvm) apply false
611
}

0 commit comments

Comments
 (0)