Initial commit

This commit is contained in:
2025-09-22 16:35:28 -03:00
parent f46e48953f
commit 8f66f954d0
10 changed files with 230 additions and 9 deletions

View File

@@ -0,0 +1,39 @@
plugins {
`kotlin-dsl`
}
group = "dev.carlosmartino.plugins.buildlogic"
dependencies {
implementation(libs.plugins.kotlinMultiplatform.toDep())
implementation(libs.plugins.kotlinSerialization.toDep())
implementation(libs.plugins.androidApplication.toDep())
implementation(libs.plugins.androidLibrary.toDep())
implementation(libs.plugins.composeCompiler.toDep())
implementation(libs.plugins.composeMultiplatform.toDep())
}
fun Provider<PluginDependency>.toDep() =
map {
"${it.pluginId}:${it.pluginId}.gradle.plugin:${it.version}"
}
tasks {
validatePlugins {
enableStricterValidation = true
failOnWarning = true
}
}
gradlePlugin {
plugins {
register("kotlinMultiplatform") {
id = "dev.carlosmartino.plugins.kotlinMultiplatform"
implementationClass = "KotlinMultiplatformConventionPlugin"
}
register("composeMultiplatform") {
id = "dev.carlosmartino.plugins.composeMultiplatform"
implementationClass = "ComposeMultiplatformConventionPlugin"
}
}
}

View File

@@ -0,0 +1,36 @@
import dev.carlosmartino.plugins.libs
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.configure
import org.gradle.kotlin.dsl.getByType
import org.jetbrains.compose.ComposeExtension
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
class ComposeMultiplatformConventionPlugin : Plugin<Project> {
override fun apply(target: Project) =
with(target) {
with(pluginManager) {
apply(libs.findPlugin("compose.plugin").get().get().pluginId)
apply(libs.findPlugin("compose.multiplatform").get().get().pluginId)
}
val composeDeps = extensions.getByType<ComposeExtension>().dependencies
extensions.configure<KotlinMultiplatformExtension> {
sourceSets.apply {
commonMain {
dependencies {
implementation(composeDeps.runtime)
implementation(composeDeps.foundation)
implementation(composeDeps.material3)
implementation(composeDeps.ui)
implementation(composeDeps.uiUtil)
implementation(composeDeps.animation)
implementation(composeDeps.animationGraphics)
implementation(composeDeps.components.resources)
}
}
}
}
}
}

View File

@@ -0,0 +1,40 @@
import com.android.build.api.dsl.LibraryExtension
import dev.carlosmartino.plugins.configureKotlinAndroid
import dev.carlosmartino.plugins.configureKotlinMultiplatform
import dev.carlosmartino.plugins.libs
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.configure
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
class KotlinMultiplatformConventionPlugin : Plugin<Project> {
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("kotlin.serialization")
.get()
.get()
.pluginId,
)
}
extensions.configure<KotlinMultiplatformExtension>(::configureKotlinMultiplatform)
extensions.configure<LibraryExtension>(::configureKotlinAndroid)
}
}

View File

@@ -0,0 +1,39 @@
package dev.carlosmartino.plugins
import com.android.build.api.dsl.LibraryExtension
import org.gradle.api.JavaVersion
import org.gradle.api.Project
import org.gradle.kotlin.dsl.get
internal fun Project.configureKotlinAndroid(
extension: LibraryExtension,
) = extension.apply {
val moduleName = path.split(":").drop(2).joinToString(".")
namespace = if (moduleName.isNotEmpty()) "dev.carlosmartino.platform.$moduleName" else "dev.carlosmartino.platform"
compileSdk = libs
.findVersion("android.compileSdk")
.get()
.requiredVersion
.toInt()
defaultConfig {
minSdk = libs
.findVersion("android.minSdk")
.get()
.requiredVersion
.toInt()
consumerProguardFiles("consumer-proguard-rules.pro")
}
sourceSets["main"].resources.srcDirs("src/commonMain/composeResources")
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
packaging {
resources {
excludes += "/META-INF/{AL2.0,LGPL2.1}"
}
}
}

View File

@@ -0,0 +1,39 @@
package dev.carlosmartino.plugins
import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
@OptIn(ExperimentalWasmDsl::class)
internal fun Project.configureKotlinMultiplatform(
extension: KotlinMultiplatformExtension,
) = extension.apply {
applyDefaultHierarchyTemplate()
jvmToolchain(17)
androidTarget {
compilerOptions {
jvmTarget.set(JvmTarget.JVM_17)
}
}
listOf(iosArm64(), iosSimulatorArm64())
sourceSets.apply {
commonMain {
dependencies {
implementation(libs.findLibrary("kotlinx.coroutines.core").get())
api(libs.findLibrary("koin.core").get())
}
androidMain {
dependencies {
implementation(libs.findLibrary("koin.android").get())
implementation(libs.findLibrary("kotlinx.coroutines.android").get())
}
}
}
}
}

View File

@@ -0,0 +1,9 @@
package dev.carlosmartino.plugins
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
get(): VersionCatalog = extensions.getByType<VersionCatalogsExtension>().named("libs")