diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 570db5d..b57b4b0 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -16,6 +16,7 @@ + - diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index 6d1bd49..a9ccc08 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -39,5 +39,9 @@ gradlePlugin { id = "net.kwmt27.jetpackcomposeplayground.library" implementationClass = "AndroidLibraryConventionPlugin" } + register("publish") { + id = "com.github.kwmt.publish" + implementationClass = "PublishPlugin" + } } } diff --git a/build-logic/convention/src/main/kotlin/ProjectDependencyGraphPlugin.kt b/build-logic/convention/src/main/kotlin/ProjectDependencyGraphPlugin.kt new file mode 100644 index 0000000..5323728 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/ProjectDependencyGraphPlugin.kt @@ -0,0 +1,130 @@ +// import org.gradle.api.Plugin +// import org.gradle.api.Project +// import org.gradle.api.artifacts.ProjectDependency +// import java.util.Locale +// +// class ProjectDependencyGraphPlugin : Plugin { +// override fun apply(target: Project) { +// // from: https://github.com/JakeWharton/SdkSearch/blob/3351cad9bfacb0a364858e843774147143f58c7a/gradle/projectDependencyGraph.gradle +// // you need to command `brew install graphviz` +// with(target) { +// task("projectDependencyGraph") { +// doLast { +// val dot = rootProject.buildDir.resolve("reports/dependency-graph/project.dot") +// dot.parentFile.mkdirs() +// dot.delete() +// +// dot.writeText("digraph {\n") +// dot.appendText(" graph [label=\"${rootProject.name}\\n \",labelloc=t,fontsize=30,ranksep=1.4];\n") +// dot.appendText(" node [style=filled, fillcolor=\"#bbbbbb\"];\n") +// dot.appendText(" rankdir=TB;\n") +// val rootProjects = mutableListOf(rootProject) +// val queue: MutableList = mutableListOf(rootProject) +// +// while (queue.isNotEmpty()) { +// val project = queue.removeAt(0) +// rootProjects.add(project) +// queue.addAll(project.childProjects.values) +// } +// var projects = mutableSetOf() +// val dependencies = mutableMapOf, List>() +// val multiplatformProjects = mutableListOf() +// val jsProjects = mutableListOf() +// val androidProjects = mutableListOf() +// val javaProjects = mutableListOf() +// +// queue.add(rootProject) +// while (queue.isNotEmpty()) { +// val project = queue.removeAt(0) +// queue.addAll(project.childProjects.values) +// +// if (project.plugins.hasPlugin("org.jetbrains.kotlin.multiplatform")) { +// multiplatformProjects.add(project) +// } +// if (project.plugins.hasPlugin("kotlin2js")) { +// jsProjects.add(project) +// } +// if (project.plugins.hasPlugin("com.android.library") || project.plugins.hasPlugin( +// "com.android.application" +// ) +// ) { +// androidProjects.add(project) +// } +// if (project.plugins.hasPlugin("java-library") || project.plugins.hasPlugin("java")) { +// javaProjects.add(project) +// } +// +// project.configurations.forEach { config -> +// config.dependencies +// .withType(ProjectDependency::class.java) +// .forEach { dependency -> +// val graphKey = Pair(project, dependency.dependencyProject) +// projects.add(project) +// projects.add(dependency.dependencyProject) +// rootProjects.remove(dependency.dependencyProject) +// val traits = +// dependencies.computeIfAbsent(graphKey) { mutableListOf() } +// .toMutableList() +// +// if (config.name.lowercase().endsWith("implementation")) { +// traits.add("style=dotted") +// } +// } +// } +// } +// +// projects = projects.sortedBy { it.path }.toHashSet() +// +// dot.appendText("\n # Projects\n\n") +// for (project in projects) { +// val traits = mutableListOf() +// +// if (rootProjects.contains(project)) { +// traits.add("shape=box") +// } +// +// if (multiplatformProjects.contains(project)) { +// traits.add("fillcolor=\"#ffd2b3\"") +// } else if (jsProjects.contains(project)) { +// traits.add("fillcolor=\"#ffffba\"") +// } else if (androidProjects.contains(project)) { +// traits.add("fillcolor=\"#baffc9\"") +// } else if (javaProjects.contains(project)) { +// traits.add("fillcolor=\"#ffb3ba\"") +// } else { +// traits.add("fillcolor=\"#eeeeee\"") +// } +// +// dot.appendText(" \"${project.path}\" [${traits.joinToString(", ")}];\n") +// } +// +// dot.appendText("\n {rank = same;") +// for (project in projects) { +// if (rootProjects.contains(project)) { +// dot.appendText(" \"${project.path}\";") +// } +// } +// dot.appendText("}\n") +// +// dot.appendText("\n # Dependencies\n\n") +// dependencies.forEach { (key, traits) -> +// dot.appendText(" \"${key.first.path}\" -> \"${key.second.path}\"") +// if (traits.isNotEmpty()) { +// dot.appendText(" [${traits.joinToString(", ")}]") +// } +// dot.appendText("\n") +// } +// +// dot.appendText("}\n") +// val p = ProcessBuilder("dot", "-Tpng", "-O", "project.dot").start() +// p.waitFor() +// if (p.exitValue() != 0) { +// throw RuntimeException(p.errorStream.toString()) +// } +// +// println("Project module dependency graph created at ${dot.absolutePath}.png") +// } +// } +// } +// } +// } diff --git a/build-logic/convention/src/main/kotlin/PublishPlugin.kt b/build-logic/convention/src/main/kotlin/PublishPlugin.kt new file mode 100644 index 0000000..82922d1 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/PublishPlugin.kt @@ -0,0 +1,79 @@ +import com.android.build.api.dsl.LibraryExtension +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.publish.PublishingExtension +import org.gradle.api.publish.maven.MavenPublication +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.get +import org.gradle.kotlin.dsl.register +import java.util.Locale + +interface PublishPluginExtension { + companion object { + const val DEFAUlT_DIEMNSION = "io.github.kwmt.slide.default" + } +} + +class PublishPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + with(pluginManager) { + apply("maven-publish") + apply("com.android.library") + } + + configure { + publishing { + buildTypes.all { + val buildType = this.name + productFlavors.all { + val flavor = this.name + singleVariant("${flavor}${buildType.replaceFirstChar { + if (it.isLowerCase()) it.titlecase( + Locale.getDefault() + ) else it.toString() + }}") + } + singleVariant(buildType) + } +// singleVariant("productionRelease") { +// withSourcesJar() +// } + } + } + + configure { + publications { + register("productionRelease") { + groupId = "io.my-company" + artifactId = "my-library" + version = "1.0.3" + afterEvaluate { + components.forEach { + println("----- ${it.name}") + } + from(components["productionRelease"]) + } + } +// register("stagingRelease") { +// groupId = "io.my-company" +// artifactId = "my-library-staging" +// version = "1.0" +// afterEvaluate { +// components.forEach { +// println("----- ${it.name}") +// } +// from(components["stagingRelease"]) +// } +// } + repositories { + maven { + name = "myRepo" + url = uri(layout.buildDirectory.dir("repo")) + } + } + } + } + } + } +} diff --git a/feature/samples/build.gradle.kts b/feature/samples/build.gradle.kts index 501e22c..46e0ecc 100644 --- a/feature/samples/build.gradle.kts +++ b/feature/samples/build.gradle.kts @@ -4,8 +4,22 @@ plugins { } android { namespace = "net.kwmt27.jetpackcomposeplayground.feature.samples" + + flavorDimensions += listOf("default") + productFlavors { + register("exposed") { + dimension = "default" + } + register("paid") { + dimension = "default" + } + register("free") { + dimension = "default" + } + } } + dependencies { implementation(projects.core.ui) implementation(libs.androidx.core.ktx) @@ -24,4 +38,6 @@ dependencies { implementation(libs.coil.compose) implementation(libs.coil.gif) + + implementation("io.my-company:my-library:1.0") } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2c261e8..3dc9310 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -57,5 +57,6 @@ jetpackcomposeplayground-android-application = { id = "net.kwmt27.jetpackcompose jetpackcomposeplayground-android-library = { id = "net.kwmt27.jetpackcomposeplayground.library", version = "unspecified" } jetpackcomposeplayground-android-application-compose = { id = "net.kwmt27.jetpackcomposeplayground.application.compose", version = "unspecified" } jetpackcomposeplayground-android-library-compose = { id = "net.kwmt27.jetpackcomposeplayground.library.compose", version = "unspecified" } +com-github-kwmt-publish = { id = "com.github.kwmt.publish", version = "unspecified" } [bundles] diff --git a/settings.gradle.kts b/settings.gradle.kts index 7ca7d8d..e50289b 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -15,6 +15,10 @@ dependencyResolutionManagement { gradlePluginPortal() google() mavenCentral() +// mavenLocal() + maven { + url = uri("/Users/kwmt/personal/dev/JetpackComposePlayGround/slide/build/repo") + } } } diff --git a/slide/build.gradle.kts b/slide/build.gradle.kts index f518b3f..c76eec0 100644 --- a/slide/build.gradle.kts +++ b/slide/build.gradle.kts @@ -1,10 +1,24 @@ plugins { alias(libs.plugins.jetpackcomposeplayground.android.library) alias(libs.plugins.jetpackcomposeplayground.android.library.compose) + alias(libs.plugins.com.github.kwmt.publish) } android { namespace = "com.github.kwmt.slide" + val defaultDimension = PublishPluginExtension.DEFAUlT_DIEMNSION + flavorDimensions += listOf(defaultDimension) + productFlavors { + register("develop") { + dimension = defaultDimension + } + register("staging") { + dimension = defaultDimension + } + register("production") { + dimension = defaultDimension + } + } } dependencies {