Skip to content

Commit edb5af2

Browse files
authored
Collect BOM constraints automatically (#1269)
* Collect BOM constraints automatically Closes: #1121 * Publish assetfilesystem
1 parent 80097ad commit edb5af2

File tree

3 files changed

+58
-13
lines changed

3 files changed

+58
-13
lines changed

build-support/src/main/kotlin/bom.kt

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import java.util.Locale
2+
import org.gradle.api.Project
3+
import org.gradle.api.artifacts.dsl.DependencyConstraintHandler
4+
import org.gradle.kotlin.dsl.getByType
5+
import org.gradle.kotlin.dsl.withType
6+
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
7+
import org.jetbrains.kotlin.gradle.plugin.KotlinAndroidPluginWrapper
8+
import org.jetbrains.kotlin.gradle.plugin.KotlinJsPluginWrapper
9+
import org.jetbrains.kotlin.gradle.plugin.KotlinMultiplatformPluginWrapper
10+
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
11+
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMetadataTarget
12+
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget
13+
14+
/**
15+
* Collect all the root project's multiplatform targets and add them to the BOM.
16+
*
17+
* Only published subprojects are included.
18+
*
19+
* This supports Kotlin/Multiplatform and Kotlin/JS subprojects.
20+
*/
21+
fun Project.collectBomConstraints() {
22+
val bomConstraints: DependencyConstraintHandler = dependencies.constraints
23+
rootProject.subprojects {
24+
val subproject = this
25+
26+
subproject.plugins.withId("com.vanniktech.maven.publish.base") {
27+
subproject.plugins.withType<KotlinAndroidPluginWrapper> {
28+
bomConstraints.api(subproject)
29+
}
30+
31+
subproject.plugins.withType<KotlinJsPluginWrapper> {
32+
bomConstraints.api(subproject)
33+
}
34+
35+
subproject.plugins.withType<KotlinMultiplatformPluginWrapper> {
36+
subproject.extensions.getByType<KotlinMultiplatformExtension>().targets.all {
37+
bomConstraints.api(dependencyConstraint(this))
38+
}
39+
}
40+
}
41+
}
42+
}
43+
44+
/** Returns a string like "com.squareup.okio:okio-iosarm64:3.4.0" for this target. */
45+
private fun Project.dependencyConstraint(target: KotlinTarget): String {
46+
val artifactId = when (target) {
47+
is KotlinMetadataTarget -> name
48+
is KotlinJsTarget -> "$name-js"
49+
else -> "$name-${target.targetName.toLowerCase(Locale.ROOT)}"
50+
}
51+
return "$group:$artifactId:$version"
52+
}
53+
54+
private fun DependencyConstraintHandler.api(constraintNotation: Any) =
55+
add("api", constraintNotation)

okio-assetfilesystem/build.gradle.kts

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import com.vanniktech.maven.publish.JavadocJar.Dokka
2-
import com.vanniktech.maven.publish.KotlinMultiplatform
1+
import com.vanniktech.maven.publish.AndroidSingleVariantLibrary
32
import com.vanniktech.maven.publish.MavenPublishBaseExtension
43

54
plugins {
@@ -32,6 +31,6 @@ dependencies {
3231

3332
configure<MavenPublishBaseExtension> {
3433
configure(
35-
KotlinMultiplatform(javadocJar = Dokka("dokkaGfm"))
34+
AndroidSingleVariantLibrary()
3635
)
3736
}

okio-bom/build.gradle.kts

+1-10
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,7 @@ plugins {
33
id("java-platform")
44
}
55

6-
dependencies {
7-
constraints {
8-
api(projects.okio)
9-
api(projects.okioFakefilesystem)
10-
if (kmpJsEnabled) {
11-
// No typesafe project accessor as the accessor won't exist if kmpJs is not enabled.
12-
api(project(":okio-nodefilesystem"))
13-
}
14-
}
15-
}
6+
collectBomConstraints()
167

178
extensions.configure<PublishingExtension> {
189
publications.create("maven", MavenPublication::class) {

0 commit comments

Comments
 (0)