Skip to content

Commit 93acc76

Browse files
committed
Publishing setup
1 parent 5f3c480 commit 93acc76

14 files changed

+224
-209
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ lint.xml
55
.idea/
66
/iOS/NameGame/.idea/
77
.DS_Store
8+
*.hprof
89
/captures
910
.externalNativeBuild
1011
node_modules/

build-conventions/src/main/kotlin/convention.control.gradle.kts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,24 +46,25 @@ fun control(targets: NamedDomainObjectCollection<KotlinTarget>) {
4646
val linuxHostTargets = nativeTargets.matching { it.konanTarget.buildHost == Family.LINUX }
4747
val osxHostTargets = nativeTargets.matching { it.konanTarget.buildHost == Family.OSX }
4848
val mainHostTargets = targets.matching { it !in nativeTargets }
49+
val mainEnabled = !CI || isMainHost
4950
linuxHostTargets.onlyBuildIf {
50-
val enabled = HostManager.hostIsLinux
51+
val enabled = mainEnabled || HostManager.hostIsLinux
5152
printlnCI("[${it.name}] ${!CI} || $SANDBOX || ${HostManager.hostIsLinux} = $enabled")
5253
enabled
5354
}
5455
osxHostTargets.onlyBuildIf {
55-
val enabled = HostManager.hostIsMac
56+
val enabled = mainEnabled || HostManager.hostIsMac
5657
printlnCI("[${it.name}] ${!CI} || $SANDBOX || ${HostManager.hostIsMac} = $enabled")
5758
enabled
5859
}
5960
windowsHostTargets.onlyBuildIf {
60-
val enabled = HostManager.hostIsMingw
61+
val enabled = mainEnabled || HostManager.hostIsMingw
6162
printlnCI("[${it.name}] ${!CI} || $SANDBOX || ${HostManager.hostIsMingw} = $enabled")
6263
enabled
6364
}
6465
mainHostTargets.onlyBuildIf {
65-
val enabled = !CI || SANDBOX || isMainHost
66+
val enabled = mainEnabled || SANDBOX
6667
printlnCI("[${it.name}] ${!CI} || $SANDBOX || $isMainHost = $enabled")
67-
enabled
68+
mainEnabled
6869
}
6970
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget
2+
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
3+
import org.jetbrains.kotlin.konan.target.Family
4+
import org.jetbrains.kotlin.konan.target.HostManager
5+
import util.buildHost
6+
7+
plugins {
8+
kotlin("multiplatform")
9+
id("convention.publishing")
10+
}
11+
12+
kotlin {
13+
fun NamedDomainObjectCollection<out Named>.onlyPublishIf(enabled: Spec<in Task>) {
14+
publishing {
15+
publications {
16+
matching { it.name in this@onlyPublishIf.names }.all {
17+
val targetPublication = this@all
18+
tasks {
19+
withType<AbstractPublishToMaven>()
20+
.all { onlyIf { publication != targetPublication || enabled(this) } }
21+
withType<GenerateModuleMetadata>()
22+
.all { onlyIf { publication.orNull != targetPublication || enabled(this) } }
23+
}
24+
}
25+
}
26+
}
27+
}
28+
29+
val nativeTargets = targets.withType<KotlinNativeTarget>()
30+
val windowsHostTargets = nativeTargets.matching { it.konanTarget.buildHost == Family.MINGW }
31+
val linuxHostTargets = nativeTargets.matching { it.konanTarget.buildHost == Family.LINUX }
32+
val osxHostTargets = nativeTargets.matching { it.konanTarget.buildHost == Family.OSX }
33+
val mainHostTargets = targets.matching { it !in nativeTargets }
34+
val androidTargets = targets.withType<KotlinAndroidTarget>()
35+
val mpp = objects.domainObjectContainer(Named::class.java)
36+
mpp.add(Named { "kotlinMultiplatform" })
37+
38+
androidTargets.all {
39+
if (!CI || SANDBOX || isMainHost) {
40+
publishLibraryVariants("release", "debug")
41+
}
42+
}
43+
44+
linuxHostTargets.onlyPublishIf {
45+
val enabled = !CI || SANDBOX || HostManager.hostIsLinux
46+
printlnCI("[${it.name}] ${!CI} || $SANDBOX || ${HostManager.hostIsLinux} = $enabled")
47+
enabled
48+
}
49+
osxHostTargets.onlyPublishIf {
50+
val enabled = !CI || SANDBOX || HostManager.hostIsMac
51+
printlnCI("[${it.name}] ${!CI} || $SANDBOX || ${HostManager.hostIsMac} = $enabled")
52+
enabled
53+
}
54+
windowsHostTargets.onlyPublishIf {
55+
val enabled = !CI || SANDBOX || HostManager.hostIsMingw
56+
printlnCI("[${it.name}] ${!CI} || $SANDBOX || ${HostManager.hostIsMingw} = $enabled")
57+
enabled
58+
}
59+
mainHostTargets.onlyPublishIf {
60+
val enabled = !CI || SANDBOX || isMainHost
61+
printlnCI("[${it.name}] ${!CI} || $SANDBOX || $isMainHost = $enabled")
62+
enabled
63+
}
64+
mpp.onlyPublishIf {
65+
val enabled = !CI || SANDBOX || isMainHost
66+
println("[${it.name}] ${!CI} || $SANDBOX || $isMainHost = $enabled")
67+
enabled
68+
}
69+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
plugins {
2+
id("convention.common")
3+
id("io.github.gradle-nexus.publish-plugin")
4+
}
5+
6+
nexusPublishing {
7+
repositories {
8+
sonatype {
9+
nexusUrl by uri("https://oss.sonatype.org/service/local/")
10+
snapshotRepositoryUrl by uri("https://oss.sonatype.org/content/repositories/snapshots/")
11+
val checkProp = { pName: String ->
12+
val exists = findProperty("sonatypeUsername")?.toString()?.takeIf(String::isNotBlank)
13+
?.let { "EXISTS" } ?: "MISSING"
14+
printlnCI("$pName: $exists")
15+
}
16+
checkProp("sonatypeUsername")
17+
checkProp("sonatypePassword")
18+
}
19+
}
20+
}
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
import org.jetbrains.kotlin.konan.target.HostManager
2+
import util.Git
3+
4+
plugins {
5+
id("convention.common")
6+
id("org.jetbrains.dokka")
7+
`maven-publish`
8+
signing
9+
}
10+
11+
tasks {
12+
register<Jar>("javadocJar") {
13+
dependsOn(dokkaHtml)
14+
archiveClassifier.set("javadoc")
15+
from(dokkaHtml.get().outputDirectory)
16+
}
17+
withType<Jar> {
18+
manifest {
19+
attributes += sortedMapOf(
20+
"Built-By" to System.getProperty("user.name"),
21+
"Build-Jdk" to System.getProperty("java.version"),
22+
"Implementation-Version" to project.version,
23+
"Created-By" to "${GradleVersion.current()}",
24+
"Created-From" to "${Git.headCommitHash}"
25+
)
26+
}
27+
}
28+
val cleanMavenLocal by registering {
29+
group = "build"
30+
doLast {
31+
val m2Repo = file("${System.getProperty("user.home")}/.m2/repository")
32+
val groupRepo = file("$m2Repo/${project.group.toString().replace(".", "/")}")
33+
publishing.publications.filterIsInstance<MavenPublication>().forEach {
34+
groupRepo.resolve(it.artifactId).deleteRecursively()
35+
}
36+
}
37+
}
38+
named("clean") {
39+
dependsOn(cleanMavenLocal)
40+
}
41+
register("publishToLocal") {
42+
description = "Publishes all packages to local maven repository at rootDir/build/localMaven"
43+
dependsOn("publishAllPublicationsToLocalRepository")
44+
}
45+
}
46+
47+
signing {
48+
val signingKey: String? by project
49+
val signingPassword: String? by project
50+
if (signingKey != null) {
51+
useInMemoryPgpKeys(signingKey, signingPassword)
52+
sign(publishing.publications)
53+
}
54+
}
55+
56+
val isMainHost = HostManager.simpleOsName().equals("${project.findProperty("project.mainOS")}", true)
57+
58+
publishing {
59+
publications {
60+
val ghOwnerId: String = project.findProperty("gh.owner.id")!!.toString()
61+
val ghOwnerName: String = project.findProperty("gh.owner.name")!!.toString()
62+
val ghOwnerOrganization: String = project.findProperty("gh.owner.organization")!!.toString()
63+
val ghOwnerOrganizationUrl: String = project.findProperty("gh.owner.organization.url")!!.toString()
64+
withType<MavenPublication> {
65+
artifact(tasks["javadocJar"])
66+
pom {
67+
name by project.name
68+
url by "https://github.com/$ghOwnerId/${rootProject.name}"
69+
description by provider { project.description }
70+
71+
licenses {
72+
license {
73+
name by "The Apache License, Version 2.0"
74+
url by "https://www.apache.org/licenses/LICENSE-2.0.txt"
75+
distribution by "repo"
76+
}
77+
}
78+
79+
developers {
80+
developer {
81+
id by ghOwnerId
82+
name by ghOwnerName
83+
organization by ghOwnerOrganization
84+
organizationUrl by ghOwnerOrganizationUrl
85+
}
86+
}
87+
88+
scm {
89+
connection by "scm:git:git@github.com:$ghOwnerId/${rootProject.name.toLowerCase()}.git"
90+
url by "https://github.com/$ghOwnerId/${rootProject.name.toLowerCase()}"
91+
tag by Git.headCommitHash
92+
}
93+
}
94+
}
95+
96+
repositories {
97+
maven("https://maven.pkg.github.com/$ghOwnerId/${rootProject.name}") {
98+
name = "GitHub"
99+
credentials {
100+
username = System.getenv("GH_USERNAME")
101+
password = System.getenv("GH_PASSWORD")
102+
}
103+
}
104+
maven("file://${rootProject.buildDir}/localMaven") {
105+
name = "Local"
106+
}
107+
}
108+
}
109+
}

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
plugins {
22
id("convention.common")
3+
id("convention.publishing-nexus")
34
if (System.getenv("CI") == null) id("convention.git-hooks")
45
}
56

examples/build.gradle.kts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,25 @@ gradleEnterprise {
99
}
1010
}
1111

12-
// TODO(COMPOSITE) Remove once KMP properly supports composite builds
12+
// TODO(KT-52172) Remove once KMP properly supports composite builds
1313
allprojects {
14+
if (findProperty("project.localRepo") == "true") {
15+
repositories {
16+
val local = maven("file://${rootProject.projectDir.parentFile}/build/localMaven") {
17+
name = "Local"
18+
}
19+
remove(local)
20+
add(0, local)
21+
}
22+
}
1423
configurations.all {
1524
resolutionStrategy {
1625
dependencySubstitution {
1726
val reduxVersion = "+"
18-
substitute(module("org.reduxkotlin:redux-kotlin"))
19-
.using(module("org.reduxkotlin:redux-kotlin:$reduxVersion"))
20-
substitute(module("org.reduxkotlin:redux-kotlin-threadsafe"))
21-
.using(module("org.reduxkotlin:redux-kotlin-threadsafe:$reduxVersion"))
27+
substitute(module("org.reduxkotlin:redux-kotlin")).using(module("org.reduxkotlin:redux-kotlin:$reduxVersion"))
28+
substitute(module("org.reduxkotlin:redux-kotlin-threadsafe")).using(
29+
module("org.reduxkotlin:redux-kotlin-threadsafe:$reduxVersion")
30+
)
2231
}
2332
}
2433
}

examples/gradle.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ android.useAndroidX=true
22
kotlin.mpp.stability.nowarn=true
33
kotlin.mpp.androidSourceSetLayoutVersion=2
44
kotlin.native.ignoreDisabledTargets=true
5+
project.localRepo=false

examples/settings.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ refreshVersions {
1717
}
1818

1919
includeBuild("../build-conventions/")
20-
// TODO(COMPOSITE) Uncomment once KMP properly supports composite builds
20+
// TODO(KT-52172) Uncomment once KMP properly supports composite builds
2121
// includeBuild("../")
2222

2323
include(

gradle/pom.gradle

Lines changed: 0 additions & 29 deletions
This file was deleted.

0 commit comments

Comments
 (0)