Skip to content

Commit d22e21c

Browse files
authored
Fix maven central publishing (#42)
* refine maven publish convention, it seems to work a bit better * rename extension helper function configuring param to 'configure' * fix spelling, kxtsgen -> kxstsgen * rename libs 'qoomonGitVersioning' to 'gitVersioningPlugin'
1 parent a50824c commit d22e21c

File tree

9 files changed

+94
-74
lines changed

9 files changed

+94
-74
lines changed

buildSrc/build.gradle.kts

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ dependencies {
2323

2424
implementation(libs.gradleNodePlugin)
2525

26-
implementation(libs.qoomonGitVersioning)
26+
implementation(libs.gitVersioningPlugin)
2727
}
2828

2929

buildSrc/src/main/kotlin/buildsrc/config/gradle.kt

+33
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,15 @@
11
package buildsrc.config
22

3+
import org.gradle.api.Action
4+
import org.gradle.api.Project
5+
import org.gradle.api.artifacts.repositories.PasswordCredentials
36
import org.gradle.api.file.ProjectLayout
7+
import org.gradle.api.provider.Provider
8+
import org.gradle.api.provider.ProviderFactory
9+
import org.gradle.kotlin.dsl.findByType
410
import org.gradle.plugins.ide.idea.model.IdeaModule
11+
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
12+
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
513

614

715
/** exclude generated Gradle code, so it doesn't clog up search results */
@@ -21,3 +29,28 @@ fun IdeaModule.excludeGeneratedGradleDsl(layout: ProjectLayout) {
2129
)
2230
)
2331
}
32+
33+
34+
// https://github.com/gradle/gradle/issues/20925
35+
fun ProviderFactory.credentialsAction(
36+
repositoryName: String
37+
): Provider<Action<PasswordCredentials>> = zip(
38+
gradleProperty("${repositoryName}Username"),
39+
gradleProperty("${repositoryName}Password"),
40+
) { user, pass ->
41+
Action<PasswordCredentials> {
42+
username = user
43+
password = pass
44+
}
45+
}
46+
47+
48+
/** Logic from [KotlinJvmTarget.withJava] */
49+
fun Project.isKotlinMultiplatformJavaEnabled(): Boolean {
50+
val multiplatformExtension: KotlinMultiplatformExtension? =
51+
extensions.findByType(KotlinMultiplatformExtension::class)
52+
53+
return multiplatformExtension?.targets
54+
?.any { it is KotlinJvmTarget && it.withJavaEnabled }
55+
?: false
56+
}

buildSrc/src/main/kotlin/buildsrc/config/publishing.kt

+31-4
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,53 @@ package buildsrc.config
22

33
import org.gradle.api.Project
44
import org.gradle.api.publish.PublishingExtension
5+
import org.gradle.api.publish.maven.MavenPublication
56
import org.gradle.kotlin.dsl.configure
67
import org.gradle.kotlin.dsl.getByType
78
import org.gradle.plugins.signing.SigningExtension
89

910

11+
fun MavenPublication.createKxsTsGenPom(): Unit = pom {
12+
name.set("Kotlinx Serialization Typescript Generator")
13+
description.set("KxsTsGen creates TypeScript interfaces from Kotlinx Serialization @Serializable classes")
14+
url.set("https://github.com/adamko-dev/kotlinx-serialization-typescript-generator")
15+
16+
licenses {
17+
license {
18+
name.set("The Apache License, Version 2.0")
19+
url.set("https://www.apache.org/licenses/LICENSE-2.0.txt")
20+
}
21+
}
22+
23+
developers {
24+
developer {
25+
email.set("[email protected]")
26+
}
27+
}
28+
29+
scm {
30+
connection.set("scm:git:git://github.com/adamko-dev/kotlinx-serialization-typescript-generator.git")
31+
developerConnection.set("scm:git:ssh://github.com:adamko-dev/kotlinx-serialization-typescript-generator.git")
32+
url.set("https://github.com/adamko-dev/kotlinx-serialization-typescript-generator")
33+
}
34+
}
35+
36+
1037
// hacks because IntelliJ still doesn't properly load DSL accessors for buildSrc
1138

1239

1340
/** Configure [PublishingExtension] */
14-
fun Project.publishing(action: PublishingExtension.() -> Unit): Unit =
15-
extensions.configure(action)
41+
fun Project.publishing(configure: PublishingExtension.() -> Unit): Unit =
42+
extensions.configure(configure)
1643

1744

1845
val Project.publishing: PublishingExtension
1946
get() = extensions.getByType<PublishingExtension>()
2047

2148

2249
/** Configure [SigningExtension] */
23-
fun Project.signing(action: SigningExtension.() -> Unit): Unit =
24-
extensions.configure(action)
50+
fun Project.signing(configure: SigningExtension.() -> Unit): Unit =
51+
extensions.configure(configure)
2552

2653

2754
val Project.signing: SigningExtension
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package buildsrc.convention
22

3+
import buildsrc.config.createKxsTsGenPom
4+
import buildsrc.config.credentialsAction
5+
import buildsrc.config.isKotlinMultiplatformJavaEnabled
36
import buildsrc.config.publishing
47
import buildsrc.config.signing
5-
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
68
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMultiplatformPlugin
7-
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
89

910

1011
plugins {
@@ -13,15 +14,8 @@ plugins {
1314
}
1415

1516
val sonatypeRepositoryCredentials: Provider<Action<PasswordCredentials>> =
16-
providers.zip(
17-
providers.gradleProperty("sonatypeRepositoryUsername"),
18-
providers.gradleProperty("sonatypeRepositoryPassword"),
19-
) { user, pass ->
20-
Action<PasswordCredentials> {
21-
username = user
22-
password = pass
23-
}
24-
}
17+
providers.credentialsAction("sonatypeRepository")
18+
2519

2620
val sonatypeRepositoryReleaseUrl: Provider<String> = provider {
2721
if (version.toString().endsWith("SNAPSHOT")) {
@@ -49,36 +43,36 @@ val javadocJarStub by tasks.registering(Jar::class) {
4943
}
5044

5145

52-
tasks.matching {
53-
it.name.startsWith(PublishingPlugin.PUBLISH_LIFECYCLE_TASK_NAME)
54-
&& it.group == PublishingPlugin.PUBLISH_TASK_GROUP
55-
}.configureEach {
46+
tasks.withType<AbstractPublishToMaven>().configureEach {
47+
// Gradle warns about some signing tasks using publishing task outputs without explicit
48+
// dependencies. I'm not going to go through them all and fix them, so here's a quick fix.
49+
dependsOn(tasks.withType<Sign>())
50+
5651
if (sonatypeRepositoryCredentials.isPresent()) {
5752
dependsOn(javadocJarStub)
5853
}
54+
5955
doLast {
6056
logger.lifecycle("[${this.name}] ${project.group}:${project.name}:${project.version}")
6157
}
6258
}
6359

6460

65-
// Gradle warns about some signing tasks using publishing task outputs without explicit
66-
// dependencies. I'm not going to go through them all and fix them, so here's a quick safety check.
67-
tasks.matching { it.name.startsWith("publish") }.configureEach {
68-
mustRunAfter(tasks.matching { it.name.startsWith("sign") })
69-
}
70-
71-
7261
publishing {
7362
if (sonatypeRepositoryCredentials.isPresent()) {
7463
repositories {
7564
maven(sonatypeRepositoryReleaseUrl) {
7665
name = "sonatype"
7766
credentials(sonatypeRepositoryCredentials.get())
7867
}
68+
// publish to local dir, for testing
69+
// maven {
70+
// name = "maven-internal"
71+
// url = uri(rootProject.layout.buildDirectory.dir("maven-internal"))
72+
// }
7973
}
8074
publications.withType<MavenPublication>().configureEach {
81-
createKxTsGenPom()
75+
createKxsTsGenPom()
8276
artifact(javadocJarStub)
8377
}
8478
}
@@ -124,40 +118,3 @@ plugins.withType(JavaPlatformPlugin::class).configureEach {
124118
from(components["javaPlatform"])
125119
}
126120
}
127-
128-
129-
fun MavenPublication.createKxTsGenPom(): Unit = pom {
130-
name.set("Kotlinx Serialization Typescript Generator")
131-
description.set("KxTsGen creates TypeScript interfaces from Kotlinx Serialization @Serializable classes")
132-
url.set("https://github.com/adamko-dev/kotlinx-serialization-typescript-generator")
133-
134-
licenses {
135-
license {
136-
name.set("The Apache License, Version 2.0")
137-
url.set("https://www.apache.org/licenses/LICENSE-2.0.txt")
138-
}
139-
}
140-
141-
developers {
142-
developer {
143-
email.set("[email protected]")
144-
}
145-
}
146-
147-
scm {
148-
connection.set("scm:git:git://github.com/adamko-dev/kotlinx-serialization-typescript-generator.git")
149-
developerConnection.set("scm:git:ssh://github.com:adamko-dev/kotlinx-serialization-typescript-generator.git")
150-
url.set("https://github.com/adamko-dev/kotlinx-serialization-typescript-generator")
151-
}
152-
}
153-
154-
155-
/** Logic from [KotlinJvmTarget.withJava] */
156-
fun Project.isKotlinMultiplatformJavaEnabled(): Boolean {
157-
val multiplatformExtension: KotlinMultiplatformExtension? =
158-
extensions.findByType(KotlinMultiplatformExtension::class)
159-
160-
return multiplatformExtension?.targets
161-
?.any { it is KotlinJvmTarget && it.withJavaEnabled }
162-
?: false
163-
}

docs/tuples.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ In TypeScript, tuples are a compact format for data structures. They're like fix
2727
that only contain the type. This is especially useful when using JSON, as including property names
2828
means the messages are much larger.
2929

30-
Tuples are a bit difficult to create in Kotlinx Serialization, but KxTsGen includes
30+
Tuples are a bit difficult to create in Kotlinx Serialization, but KxsTsGen includes
3131
[TupleSerializer](../modules/kxs-ts-gen-core/src/commonMain/kotlin/dev/adamko/kxstsgen/core/experiments/tuple.kt)
3232
which can help. It requires a name, an ordered list of elements, and a constructor for
3333
deserializing.

gradle/libs.versions.toml

+6-3
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,7 @@ kotlinProcess = "1.3.1"
2222
classgraph = "4.8.143"
2323

2424
gradleNodePlugin = "3.3.0"
25-
26-
qoomonGitVersioning = "6.1.2"
25+
gitVersioningPlugin = "6.1.2"
2726

2827
[libraries]
2928

@@ -55,6 +54,7 @@ kotlinProcess = { group = "com.github.pgreze", name = "kotlin-process", version.
5554
kotlinCompileTesting = { group = "com.github.tschuchortdev", name = "kotlin-compile-testing", version.ref = "kotlinCompileTesting" }
5655
kotlinCompileTesting-ksp = { group = "com.github.tschuchortdev", name = "kotlin-compile-testing-ksp", version.ref = "kotlinCompileTesting" }
5756

57+
## Kotest ##
5858

5959
kotest-bom = { group = "io.kotest", name = "kotest-bom", version.ref = "kotest" }
6060
kotest-assertionsCore = { group = "io.kotest", name = "kotest-assertions-core" }
@@ -65,13 +65,16 @@ kotest-frameworkDatatest = { group = "io.kotest", name = "kotest-framework-datat
6565
kotest-runnerJUnit5 = { group = "io.kotest", name = "kotest-runner-junit5" }
6666
kotest-gradlePlugin = { group = "io.kotest", name = "kotest-framework-multiplatform-plugin-gradle", version.ref = "kotest" }
6767

68+
## Knit ##
6869

6970
kotlinx-knit = { group = "org.jetbrains.kotlinx", name = "kotlinx-knit", version.ref = "kotlinx-knit" }
7071
kotlinx-knit-test = { group = "org.jetbrains.kotlinx", name = "kotlinx-knit-test", version.ref = "kotlinx-knit" }
7172
kotlinx-knit-gradlePlugin = { group = "org.jetbrains.kotlinx", name = "kotlinx-knit", version.ref = "kotlinx-knit" }
7273

7374

74-
qoomonGitVersioning = { group = "me.qoomon", name = "gradle-git-versioning-plugin", version.ref = "qoomonGitVersioning" }
75+
### Gradle Plugins ###
76+
77+
gitVersioningPlugin = { group = "me.qoomon", name = "gradle-git-versioning-plugin", version.ref = "gitVersioningPlugin" }
7578

7679
[bundles]
7780

modules/kxs-ts-gen-core/src/commonMain/kotlin/dev/adamko/kxstsgen/KxsTsConfig.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package dev.adamko.kxstsgen
22

33
import dev.adamko.kxstsgen.core.TsDeclaration
4-
import dev.adamko.kxstsgen.core.UnimplementedKxTsGenApi
4+
import dev.adamko.kxstsgen.core.UnimplementedKxsTsGenApi
55
import dev.adamko.kxstsgen.core.util.MutableMapWithDefaultPut
66
import kotlin.jvm.JvmInline
77
import kotlin.reflect.KClass
@@ -25,9 +25,9 @@ import kotlinx.serialization.modules.SerializersModuleCollector
2525
data class KxsTsConfig(
2626
val indent: String = " ",
2727
val declarationSeparator: String = "\n\n",
28-
@UnimplementedKxTsGenApi
28+
@UnimplementedKxsTsGenApi
2929
val namespaceConfig: NamespaceConfig = NamespaceConfig.Disabled,
30-
@UnimplementedKxTsGenApi
30+
@UnimplementedKxsTsGenApi
3131
val typeAliasTyping: TypeAliasTypingConfig = TypeAliasTypingConfig.None,
3232
val serializersModule: SerializersModule = EmptySerializersModule,
3333
) {

modules/kxs-ts-gen-core/src/commonMain/kotlin/dev/adamko/kxstsgen/KxsTsGenerator.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import kotlinx.serialization.descriptors.nullable
2323
* or by setting hardcoded values in [serializerDescriptorOverrides] or [descriptorOverrides],
2424
* or changed by overriding any converter.
2525
*
26-
* @param[config] General settings that affect how KxTsGen works
26+
* @param[config] General settings that affect how KxsTsGen works
2727
* @param[sourceCodeGenerator] Convert [TsElement]s to TypeScript source code
2828
*/
2929
open class KxsTsGenerator(

modules/kxs-ts-gen-core/src/commonMain/kotlin/dev/adamko/kxstsgen/core/annotations.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,4 @@ package dev.adamko.kxstsgen.core
99
)
1010
@RequiresOptIn(level = RequiresOptIn.Level.WARNING)
1111
@MustBeDocumented
12-
annotation class UnimplementedKxTsGenApi
12+
annotation class UnimplementedKxsTsGenApi

0 commit comments

Comments
 (0)