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 {