Skip to content

Commit 70dfd60

Browse files
committed
Implement convention plugins
1 parent eb4af9a commit 70dfd60

12 files changed

+260
-1
lines changed
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
plugins {
2+
`kotlin-dsl`
3+
}
4+
5+
group = "io.github.deweyreed.timer.buildlogic"
6+
7+
java {
8+
val javaVersion = JavaVersion.toVersion(libs.versions.jvmTarget.get())
9+
sourceCompatibility = javaVersion
10+
targetCompatibility = javaVersion
11+
}
12+
13+
kotlin {
14+
compilerOptions {
15+
jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget
16+
.fromTarget(libs.versions.jvmTarget.get())
17+
}
18+
}
19+
20+
dependencies {
21+
compileOnly(plugin(libs.plugins.android.application))
22+
compileOnly(plugin(libs.plugins.android.library))
23+
compileOnly(plugin(libs.plugins.kotlin.android))
24+
compileOnly(plugin(libs.plugins.kotlin.compose))
25+
compileOnly(plugin(libs.plugins.kotlin.kapt))
26+
compileOnly(plugin(libs.plugins.hilt))
27+
}
28+
29+
private fun plugin(plugin: Provider<PluginDependency>): Provider<String> {
30+
return plugin.map { "${it.pluginId}:${it.pluginId}.gradle.plugin:${it.version}" }
31+
}
32+
33+
tasks {
34+
validatePlugins {
35+
enableStricterValidation = true
36+
failOnWarning = true
37+
}
38+
}
39+
40+
gradlePlugin {
41+
plugins {
42+
register("androidApplication") {
43+
id = libs.plugins.convention.android.application.get().pluginId
44+
implementationClass = "AndroidApplicationConventionPlugin"
45+
}
46+
register("androidLibrary") {
47+
id = libs.plugins.convention.android.library.get().pluginId
48+
implementationClass = "AndroidLibraryConventionPlugin"
49+
}
50+
register("androidLibraryCompose") {
51+
id = libs.plugins.convention.android.libraryCompose.get().pluginId
52+
implementationClass = "AndroidLibraryComposeConventionPlugin"
53+
}
54+
register("hilt") {
55+
id = libs.plugins.convention.hilt.get().pluginId
56+
implementationClass = "HiltConventionPlugin"
57+
}
58+
}
59+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import com.android.build.api.dsl.ApplicationExtension
2+
import org.gradle.api.Plugin
3+
import org.gradle.api.Project
4+
import org.gradle.api.plugins.BasePluginExtension
5+
import org.gradle.kotlin.dsl.apply
6+
import org.gradle.kotlin.dsl.getByType
7+
8+
@Suppress("unused")
9+
class AndroidApplicationConventionPlugin : Plugin<Project> {
10+
override fun apply(target: Project) {
11+
target.run {
12+
val libs = libs
13+
14+
apply(plugin = libs.findPlugin("android-application").get().get().pluginId)
15+
apply(plugin = libs.findPlugin("kotlin-android").get().get().pluginId)
16+
apply(plugin = libs.findPlugin("kotlin-compose").get().get().pluginId)
17+
18+
configureKotlin()
19+
20+
val versionCode = libs.findVersion("versionCode").get().toString().toInt()
21+
val versionName = libs.findVersion("versionName").get().toString()
22+
extensions.getByType<ApplicationExtension>().run {
23+
configureAndroid(this)
24+
defaultConfig {
25+
targetSdk = libs.findVersion("targetSdk").get().toString().toInt()
26+
this.versionCode = versionCode
27+
this.versionName = versionName
28+
}
29+
configureCompose(this)
30+
}
31+
extensions.getByType<BasePluginExtension>().run {
32+
archivesName.set("TimeR.Machine-v${versionName}(${versionCode})")
33+
}
34+
}
35+
}
36+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import com.android.build.api.dsl.LibraryExtension
2+
import org.gradle.api.Plugin
3+
import org.gradle.api.Project
4+
import org.gradle.kotlin.dsl.apply
5+
import org.gradle.kotlin.dsl.getByType
6+
7+
@Suppress("unused")
8+
class AndroidLibraryComposeConventionPlugin : Plugin<Project> {
9+
override fun apply(target: Project) {
10+
target.run {
11+
val libs = libs
12+
13+
apply(plugin = libs.findPlugin("android-library").get().get().pluginId)
14+
apply(plugin = libs.findPlugin("kotlin-compose").get().get().pluginId)
15+
16+
extensions.getByType<LibraryExtension>().run {
17+
configureCompose(this)
18+
}
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.LibraryExtension
2+
import org.gradle.api.Plugin
3+
import org.gradle.api.Project
4+
import org.gradle.kotlin.dsl.apply
5+
import org.gradle.kotlin.dsl.getByType
6+
7+
@Suppress("unused")
8+
class AndroidLibraryConventionPlugin : Plugin<Project> {
9+
override fun apply(target: Project) {
10+
target.run {
11+
val libs = libs
12+
13+
apply(plugin = libs.findPlugin("android-library").get().get().pluginId)
14+
apply(plugin = libs.findPlugin("kotlin-android").get().get().pluginId)
15+
16+
configureKotlin()
17+
18+
extensions.getByType<LibraryExtension>().run {
19+
configureAndroid(this)
20+
}
21+
}
22+
}
23+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import com.android.build.api.dsl.CommonExtension
2+
import org.gradle.api.JavaVersion
3+
import org.gradle.api.Project
4+
import org.gradle.api.artifacts.VersionCatalog
5+
import org.gradle.api.artifacts.VersionCatalogsExtension
6+
import org.gradle.kotlin.dsl.dependencies
7+
import org.gradle.kotlin.dsl.getByType
8+
import org.jetbrains.kotlin.compose.compiler.gradle.ComposeCompilerGradlePluginExtension
9+
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
10+
import org.jetbrains.kotlin.gradle.dsl.KotlinAndroidProjectExtension
11+
12+
internal val Project.libs: VersionCatalog
13+
get() = extensions.getByType<VersionCatalogsExtension>().named("libs")
14+
15+
internal fun Project.configureKotlin() {
16+
val libs = libs
17+
extensions.getByType<KotlinAndroidProjectExtension>().run {
18+
compilerOptions {
19+
jvmTarget.set(
20+
JvmTarget.fromTarget(libs.findVersion("jvmTarget").get().toString())
21+
)
22+
}
23+
}
24+
}
25+
26+
internal fun Project.configureAndroid(commonExtension: CommonExtension<*, *, *, *, *, *>) {
27+
val libs = libs
28+
commonExtension.run {
29+
compileSdk = libs.findVersion("compileSdk").get().toString().toInt()
30+
defaultConfig {
31+
minSdk = libs.findVersion("minSdk").get().toString().toInt()
32+
33+
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
34+
vectorDrawables.useSupportLibrary = true
35+
}
36+
compileOptions {
37+
isCoreLibraryDesugaringEnabled = true
38+
val javaVersion =
39+
JavaVersion.toVersion(libs.findVersion("jvmTarget").get().toString())
40+
sourceCompatibility = javaVersion
41+
targetCompatibility = javaVersion
42+
}
43+
dependencies {
44+
"coreLibraryDesugaring"(libs.findLibrary("desugarJdkLibs").get())
45+
}
46+
}
47+
}
48+
49+
internal fun Project.configureCompose(commonExtension: CommonExtension<*, *, *, *, *, *>) {
50+
val libs = libs
51+
commonExtension.buildFeatures.compose = true
52+
extensions.getByType<ComposeCompilerGradlePluginExtension>().run {
53+
stabilityConfigurationFiles.addAll(
54+
isolated.rootProject.projectDirectory.file("stability-config.conf"),
55+
)
56+
}
57+
dependencies {
58+
"implementation"(platform(libs.findLibrary("compose-bom").get()))
59+
"implementation"(libs.findBundle("compose").get())
60+
}
61+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import org.gradle.api.Plugin
2+
import org.gradle.api.Project
3+
import org.gradle.kotlin.dsl.apply
4+
import org.gradle.kotlin.dsl.dependencies
5+
import org.gradle.kotlin.dsl.getByType
6+
import org.jetbrains.kotlin.gradle.plugin.KaptExtension
7+
8+
@Suppress("unused")
9+
class HiltConventionPlugin : Plugin<Project> {
10+
override fun apply(target: Project) {
11+
target.run {
12+
val libs = libs
13+
14+
apply(plugin = libs.findPlugin("kotlin-kapt").get().get().pluginId)
15+
apply(plugin = libs.findPlugin("hilt").get().get().pluginId)
16+
17+
extensions.getByType<KaptExtension>().run {
18+
correctErrorTypes = true
19+
}
20+
21+
dependencies {
22+
"implementation"(libs.findLibrary("hilt-android").get())
23+
"kapt"(libs.findLibrary("hilt-compiler").get())
24+
}
25+
}
26+
}
27+
}

build-logic/gradle.properties

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
org.gradle.parallel=true
2+
org.gradle.caching=true
3+
org.gradle.configuration-cache=true

build-logic/settings.gradle.kts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
dependencyResolutionManagement {
2+
repositories {
3+
google {
4+
content {
5+
includeGroupByRegex("com\\.android.*")
6+
includeGroupByRegex("com\\.google.*")
7+
includeGroupByRegex("androidx.*")
8+
}
9+
}
10+
mavenCentral()
11+
gradlePluginPortal()
12+
}
13+
versionCatalogs {
14+
create("libs") {
15+
from(files("../gradle/libs.versions.toml"))
16+
}
17+
}
18+
}
19+
20+
rootProject.name = "build-logic"
21+
include(":convention")

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ subprojects {
4444
freeCompilerArgs += [
4545
"-P",
4646
"plugin:androidx.compose.compiler.plugins.kotlin:stabilityConfigurationPath=" +
47-
project.rootDir.absolutePath + "/compose_compiler_config.conf"
47+
project.rootDir.absolutePath + "/stability-config.conf"
4848
]
4949
}
5050

gradle/libs.versions.toml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
[versions]
2+
jvmTarget = "17"
3+
24
agp = "8.10.1"
35

46
compileSdk = "36"
@@ -39,6 +41,11 @@ detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" }
3941
gms = "com.google.gms.google-services:4.4.3"
4042
firebase-crashlytics = "com.google.firebase.crashlytics:3.0.4"
4143

44+
convention-android-application = { id = "convention-android-application" }
45+
convention-android-library = { id = "convention-android-library" }
46+
convention-android-libraryCompose = { id = "convention-android-libraryCompose" }
47+
convention-hilt = { id = "convention-hilt" }
48+
4249
[libraries]
4350
detekt-formatting = { module = "io.gitlab.arturbosch.detekt:detekt-formatting", version.ref = "detekt" }
4451
desugarJdkLibs = "com.android.tools:desugar_jdk_libs:2.1.5"

0 commit comments

Comments
 (0)