From 27f56033b1861a4c4d7d18ef27a255a03eda6c2a Mon Sep 17 00:00:00 2001 From: Andrew Golovashevich Date: Sat, 9 Nov 2024 16:30:04 +0300 Subject: [PATCH] Utilities for publishing --- README.md | 22 ++++++++++++++ embed/build.gradle.kts | 3 ++ .../{ => plugin}/SetupBuildScript.kt | 5 +++- .../{ => plugin}/XomrkDsl.kt | 10 +++++-- .../{ => plugin}/dsl_entry_point.kt | 2 +- ...tlin.original-multiplatform-ext.properties | 2 +- .../kmp_gradle_build_helper/compilations.kt | 3 +- .../kmp_gradle_build_helper/publishing.kt | 30 +++++++++++++++++++ test/build.gradle.kts | 9 +++++- 9 files changed, 78 insertions(+), 8 deletions(-) rename embed/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/{ => plugin}/SetupBuildScript.kt (75%) rename embed/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/{ => plugin}/XomrkDsl.kt (73%) rename embed/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/{ => plugin}/dsl_entry_point.kt (88%) create mode 100644 impl/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/publishing.kt diff --git a/README.md b/README.md index a904626..3f69f7c 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,8 @@ ### As library ```kotlin +import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.* + buildscript { repositories { mavenCentral() @@ -42,6 +44,9 @@ kotlin { ### As plugin (custom repository) ```kotlin +import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.* +import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.plugin.xomrk + buildscript { repositories { mavenCentral() @@ -74,6 +79,8 @@ xomrk { This library officially isn't published, so this way wouldn't work ```kotlin +import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.* + plugins { id("ru.landgrafhomyak.kotlin.original-multiplatform-ext") version "v0.1k2.0.20" } @@ -92,6 +99,10 @@ xomrk { ## Functionality ```kotlin +import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.* + +// ... + kotlin { // Configures compilations of all targets configureAllCompilations { } @@ -116,4 +127,15 @@ kotlin { // defines all possible targets, useful for 'algorithm' libraries that are not depends on platform defineAllMultiplatformTargets() } + +publishing { + // useful for single-platform (e.g. JVM-only) libraries + forceSetAllMavenArtifactsId(project.name) + + // safe replacing for libraries with many targets + replaceAllMavenArtifactsIdPrefixes(project.name, "custom-name") + + // replacing of platform id (but better to do it in kotlin {...} block) + replaceAllMavenArtifactsIdSuffixes("js", "frontend") +} ``` \ No newline at end of file diff --git a/embed/build.gradle.kts b/embed/build.gradle.kts index b0ac03e..f09db99 100644 --- a/embed/build.gradle.kts +++ b/embed/build.gradle.kts @@ -1,5 +1,6 @@ import java.util.Properties import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.defineXomrkGiteaMavenRepo +import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.forceSetAllMavenArtifactsId import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.optInContracts buildscript { @@ -52,4 +53,6 @@ publishing { repositories { defineXomrkGiteaMavenRepo() } + + forceSetAllMavenArtifactsId(project.name) } \ No newline at end of file diff --git a/embed/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/SetupBuildScript.kt b/embed/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/plugin/SetupBuildScript.kt similarity index 75% rename from embed/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/SetupBuildScript.kt rename to embed/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/plugin/SetupBuildScript.kt index f53d0f4..509846c 100644 --- a/embed/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/SetupBuildScript.kt +++ b/embed/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/plugin/SetupBuildScript.kt @@ -1,4 +1,4 @@ -package ru.landgrafhomyak.kotlin.kmp_gradle_build_helper +package ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.plugin import org.gradle.api.Plugin import org.gradle.api.Project @@ -15,5 +15,8 @@ class SetupBuildScript : Plugin { @JvmStatic val KOTLIN_MULTIPLATFORM = "org.jetbrains.kotlin.multiplatform" + + @JvmStatic + val MAVEN_PUBLISHING = "org.gradle.maven-publish" } } \ No newline at end of file diff --git a/embed/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/XomrkDsl.kt b/embed/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/plugin/XomrkDsl.kt similarity index 73% rename from embed/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/XomrkDsl.kt rename to embed/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/plugin/XomrkDsl.kt index ecda866..5231a4d 100644 --- a/embed/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/XomrkDsl.kt +++ b/embed/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/plugin/XomrkDsl.kt @@ -1,11 +1,12 @@ -package ru.landgrafhomyak.kotlin.kmp_gradle_build_helper +package ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.plugin import kotlin.contracts.InvocationKind import kotlin.contracts.contract import kotlin.reflect.KClass import org.gradle.api.Project +import org.gradle.api.publish.PublishingExtension import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension -import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.SetupBuildScript.PluginIDs +import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.plugin.SetupBuildScript.PluginIDs open class XomrkDsl internal constructor(private val project: Project) { @Suppress("FunctionName") @@ -34,4 +35,9 @@ open class XomrkDsl internal constructor(private val project: Project) { this._wrapExtension(PluginIDs.KOTLIN_MULTIPLATFORM, KotlinMultiplatformExtension::class, config) } + + fun publishing(config: PublishingExtension.() -> Unit) { + this._wrapExtension(PluginIDs.MAVEN_PUBLISHING, PublishingExtension::class, config) + + } } \ No newline at end of file diff --git a/embed/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/dsl_entry_point.kt b/embed/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/plugin/dsl_entry_point.kt similarity index 88% rename from embed/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/dsl_entry_point.kt rename to embed/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/plugin/dsl_entry_point.kt index 48e6cce..3cd4c57 100644 --- a/embed/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/dsl_entry_point.kt +++ b/embed/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/plugin/dsl_entry_point.kt @@ -1,4 +1,4 @@ -package ru.landgrafhomyak.kotlin.kmp_gradle_build_helper +package ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.plugin import kotlin.contracts.InvocationKind import kotlin.contracts.contract diff --git a/embed/src/jvmMain/resources/META-INF/gradle-plugins/ru.landgrafhomyak.kotlin.original-multiplatform-ext.properties b/embed/src/jvmMain/resources/META-INF/gradle-plugins/ru.landgrafhomyak.kotlin.original-multiplatform-ext.properties index fe148aa..befafc3 100644 --- a/embed/src/jvmMain/resources/META-INF/gradle-plugins/ru.landgrafhomyak.kotlin.original-multiplatform-ext.properties +++ b/embed/src/jvmMain/resources/META-INF/gradle-plugins/ru.landgrafhomyak.kotlin.original-multiplatform-ext.properties @@ -1 +1 @@ -implementation-class=ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.SetupBuildScript +implementation-class=ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.plugin.SetupBuildScript diff --git a/impl/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/compilations.kt b/impl/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/compilations.kt index 9929a64..ffd86db 100644 --- a/impl/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/compilations.kt +++ b/impl/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/compilations.kt @@ -3,12 +3,11 @@ package ru.landgrafhomyak.kotlin.kmp_gradle_build_helper import org.jetbrains.kotlin.gradle.dsl.KotlinCommonCompilerOptions -import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.dsl.KotlinVersion -public fun KotlinMultiplatformExtension.configureAllCompilations(action: KotlinCompilation.() -> Unit) { +public fun KotlinMultiplatformExtension.configureAllCompilations(action: KotlinCompilation<*>.() -> Unit) { this.targets.configureEach { t -> t.compilations.configureEach(action) } diff --git a/impl/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/publishing.kt b/impl/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/publishing.kt new file mode 100644 index 0000000..33235b0 --- /dev/null +++ b/impl/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/publishing.kt @@ -0,0 +1,30 @@ +package ru.landgrafhomyak.kotlin.kmp_gradle_build_helper + +import org.gradle.api.publish.PublishingExtension +import org.gradle.api.publish.maven.MavenPublication + +public fun PublishingExtension.forceSetAllMavenArtifactsId(newName: String) { + this.publications { c -> + c.withType(MavenPublication::class.java) { p -> + p.artifactId = newName + } + } +} + +public fun PublishingExtension.replaceAllMavenArtifactsIdPrefixes(oldPrefix: String, newPrefix: String) { + val pattern = Regex("^${Regex.escape(oldPrefix)}") + this.publications { c -> + c.withType(MavenPublication::class.java) { p -> + p.artifactId = p.artifactId.replace(pattern, newPrefix) + } + } +} + +public fun PublishingExtension.replaceAllMavenArtifactsIdSuffixes(oldSuffix: String, newSuffix: String) { + val pattern = Regex("${Regex.escape(oldSuffix)}$") + this.publications { c -> + c.withType(MavenPublication::class.java) { p -> + p.artifactId = p.artifactId.replace(pattern, newSuffix) + } + } +} \ No newline at end of file diff --git a/test/build.gradle.kts b/test/build.gradle.kts index 5c82b0f..069ec40 100644 --- a/test/build.gradle.kts +++ b/test/build.gradle.kts @@ -1,7 +1,9 @@ +import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.configureAllCompilations import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.defineAllMultiplatformTargets import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.defineXomrkGiteaMavenRepo +import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.forceSetAllMavenArtifactsId import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.optInContracts -import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.xomrk +import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.plugin.xomrk buildscript { val versions = java.util.Properties() @@ -27,5 +29,10 @@ xomrk { jvmToolchain(8) defineAllMultiplatformTargets() optInContracts() + configureAllCompilations { this.compileTaskProvider } + } + + publishing { + forceSetAllMavenArtifactsId(project.name) } } \ No newline at end of file