gradle/plugins/setup/src/main/kotlin/SetupPublication.kt
@file:Suppress("TooManyFunctions") import com.android.build.gradle.LibraryExtensionimport impl.hasExtensionimport org.gradle.api.Projectimport org.gradle.api.Taskimport org.gradle.api.plugins.JavaPluginExtensionimport org.gradle.api.publish.PublicationContainerimport org.gradle.api.publish.PublishingExtensionimport org.gradle.api.publish.maven.MavenPublicationimport org.gradle.api.tasks.bundling.AbstractArchiveTaskimport org.gradle.jvm.tasks.Jarimport org.gradle.kotlin.dsl.configureimport org.gradle.kotlin.dsl.createimport org.gradle.kotlin.dsl.creatingimport org.gradle.kotlin.dsl.existingimport org.gradle.kotlin.dsl.getimport org.gradle.kotlin.dsl.getByTypeimport org.gradle.kotlin.dsl.getValueimport org.gradle.kotlin.dsl.provideDelegateimport org.gradle.kotlin.dsl.withTypeimport org.gradle.language.base.plugins.LifecycleBasePluginimport org.gradle.plugin.devel.GradlePluginDevelopmentExtensionimport org.gradle.plugins.signing.SigningExtensionimport org.jetbrains.dokka.gradle.DokkaTaskimport org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtensionimport org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtensionimport org.jetbrains.kotlin.gradle.plugin.KotlinPlatformTypeimport java.util.concurrent.atomic.AtomicBoolean /* * Set up publishing. * * Useful resources: * * - https://kotlinlang.org/docs/mpp-publish-lib.html * - https://central.sonatype.org/publish/publish-guide/ * - https://central.sonatype.org/publish/publish-gradle/ * - https://central.sonatype.org/publish/requirements/coordinates/#choose-your-coordinates * - https://getstream.io/blog/publishing-libraries-to-mavencentral-2021/ * - https://dev.to/kotlin/how-to-build-and-publish-a-kotlin-multiplatform-library-going-public-4a8k */ TODO found// TODO: Set RC/alpha/beta releases status to Ivy's: milestone/integration when it will be possible// https://github.com/gradle/gradle/issues/12600// https://github.com/gradle/gradle/issues/20016 private const val USE_DOKKA: Boolean = true fun Project.setupPublication() { val config = requireDefaults<PublicationConfig>() when { hasExtension<KotlinMultiplatformExtension>() -> setupPublicationMultiplatform(config) hasExtension<LibraryExtension>() -> setupPublicationAndroidLibrary(config) hasExtension { GradlePluginDevelopmentExtension::class } -> setupPublicationGradlePlugin(config) hasExtension<KotlinJvmProjectExtension>() -> setupPublicationKotlinJvm(config) hasExtension { JavaPluginExtension::class } -> setupPublicationJava(config) else -> error("Unsupported project type for publication") } // Reproducible builds setup // https://docs.gradle.org/current/userguide/working_with_files.html#sec:reproducible_archives tasks.withType<AbstractArchiveTask>().configureEach { isPreserveFileTimestamps = false isReproducibleFileOrder = true }} Method `setupPublicationMultiplatform` has a Cognitive Complexity of 34 (exceeds 20 allowed). Consider refactoring.private fun Project.setupPublicationMultiplatform(config: PublicationConfig) { applyMavenPublishPlugin() group = config.group version = config.version setupPublicationExtension(config) setupPublicationRepository(config) if (!isGenericCompilationEnabled) return multiplatformExtension.apply { if (targets.any { it.platformType == KotlinPlatformType.androidJvm }) { android { publishLibraryVariants("release", "debug") } // Gradle 8 compatibility if (config.isSigningEnabled) { val deps = tasks.matching { it.name.startsWith("sign") && it.name.endsWith("Publication") } tasks.matching { it.name.endsWith("PublicationToMavenLocal") || it.name.endsWith("PublicationToMavenRepository") }.configureEach { dependsOn(deps) } } } }} Method `setupPublicationAndroidLibrary` has 30 lines of code (exceeds 25 allowed). Consider refactoring.private fun Project.setupPublicationAndroidLibrary(config: PublicationConfig) { if (!isGenericCompilationEnabled) { return } applyMavenPublishPlugin() val androidExtension = extensions.getByType<LibraryExtension>() val sourceJarTask by tasks.creating(Jar::class) { from(androidExtension.sourceSets.getByName("main").java.srcDirs) archiveClassifier.set("source") } fun PublicationContainer.createMavenPublication(name: String, artifactIdSuffix: String) { create<MavenPublication>(name) { from(components[name]) artifact(sourceJarTask) groupId = config.group version = config.version artifactId = "${project.name}$artifactIdSuffix" setupPublicationPom(project, config) } } afterEvaluate { extensions.configure<PublishingExtension> { publications { createMavenPublication(name = "debug", artifactIdSuffix = "-debug") createMavenPublication(name = "release", artifactIdSuffix = "") } } } setupPublicationRepository(config)} private fun Project.setupPublicationGradlePlugin(config: PublicationConfig) { applyMavenPublishPlugin() group = config.group version = config.version val gradlePluginExtension = extensions.getByType<GradlePluginDevelopmentExtension>() val sourceJarTask by tasks.creating(Jar::class) { from(gradlePluginExtension.pluginSourceSet.java.srcDirs) archiveClassifier.set("sources") } afterEvaluate { setupPublicationExtension(config, sourceJarTask) } setupPublicationRepository(config)} Similar blocks of code found in 2 locations. Consider refactoring.private fun Project.setupPublicationKotlinJvm(config: PublicationConfig) { if (!isGenericCompilationEnabled) { return } applyMavenPublishPlugin() group = config.group version = config.version val kotlinPluginExtension = extensions.getByType<KotlinJvmProjectExtension>() val sourceJarTask by tasks.creating(Jar::class) { from(kotlinPluginExtension.sourceSets.getByName("main").kotlin.srcDirs) archiveClassifier.set("sources") } setupPublicationExtension(config, sourceJarTask) setupPublicationRepository(config)} Similar blocks of code found in 2 locations. Consider refactoring.private fun Project.setupPublicationJava(config: PublicationConfig) { if (!isGenericCompilationEnabled) { return } applyMavenPublishPlugin() group = config.group version = config.version val javaPluginExtension = extensions.getByType<JavaPluginExtension>() val sourceJarTask by tasks.creating(Jar::class) { from(javaPluginExtension.sourceSets.getByName("main").java.srcDirs) archiveClassifier.set("sources") } setupPublicationExtension(config, sourceJarTask) setupPublicationRepository(config)} Method `setupPublicationPom` has a Cognitive Complexity of 36 (exceeds 20 allowed). Consider refactoring.
Method `setupPublicationPom` has 50 lines of code (exceeds 25 allowed). Consider refactoring.internal fun MavenPublication.setupPublicationPom(project: Project, config: PublicationConfig) { // Publish docs with each artifact. val useDokka = USE_DOKKA && !config.isSnapshot try { check(useDokka) { "Dokka disabled" } val taskName = "dokkaHtmlAsJavadoc" val dokkaHtmlAsJavadoc = project.tasks.run { findByName(taskName) ?: run { val dokkaHtml by project.tasks.existing(DokkaTask::class) create<Jar>(taskName) { setupJavadocJar() from(dokkaHtml) } } } artifact(dokkaHtmlAsJavadoc) } catch (@Suppress("TooGenericExceptionCaught") e: Throwable) { if (useDokka) { project.logger.warn("Fallback to Javadoc. Dokka publication setup error: $e", e) } artifact(project.javadocJarTask()) } pom { name.set(config.projectName) description.set(config.projectDescription) url.set(config.publicationUrl) if (!config.licenseName.isNullOrEmpty()) { licenses { license { name.set(config.licenseName) url.set(config.licenseUrl) } } } developers { developer { id.set(config.developerId) name.set(config.developerName) email.set(config.developerEmail) } } scm { url.set(config.projectUrl) connection.set(config.scmUrl) developerConnection.set(config.scmUrl) config.scmTag.takeIf { !it.isNullOrEmpty() }?.let { tag.set(it) } } }} private val signingKeyNotificationLogged = AtomicBoolean() Method `setupPublicationRepository` has 26 lines of code (exceeds 25 allowed). Consider refactoring.internal fun Project.setupPublicationRepository(config: PublicationConfig) { val notify = signingKeyNotificationLogged.compareAndSet(false, true) if (config.isSigningEnabled) { if (notify) logger.lifecycle("> Conf SIGNING_KEY SET, applying signing configuration") plugins.apply("signing") } else if (notify) { logger.warn("> Conf SIGNING_KEY IS NOT SET! Publications are unsigned") } extensions.configure<PublishingExtension> { if (config.isSigningEnabled) { extensions.configure<SigningExtension> { useInMemoryPgpKeys(config.signingKey, config.signingPassword) sign(publications) } } repositories { maven { setUrl(config.repositoryUrl) credentials { username = config.repositoryUserName password = config.repositoryPassword } } } }} private fun Project.setupPublicationExtension(config: PublicationConfig, sourceJarTask: Jar? = null) { extensions.configure<PublishingExtension> { publications.withType<MavenPublication>().configureEach { sourceJarTask?.let { artifact(it) } setupPublicationPom(project, config) } }} private fun Project.applyMavenPublishPlugin() = plugins.apply("maven-publish") private fun Project.javadocJarTask(): Task { val taskName = "javadocJar" return tasks.findByName(taskName) ?: tasks.create<Jar>(taskName).apply(Jar::setupJavadocJar)} private fun Jar.setupJavadocJar() { group = LifecycleBasePlugin.BUILD_GROUP description = "Assembles a jar archive containing the Javadoc API documentation." archiveClassifier.set("javadoc")}