Remove 'org.jetbrains.kotlin.platform.type' attribute from publication

Temporary workaround for Kotlin Gradle plugin publications until
https://youtrack.jetbrains.com/issue/KT-52987 will be implemented.

Requested by Gradle team for Gradle 7.6 compatibility.
This commit is contained in:
Yahor Berdnikau
2022-06-27 16:54:45 +02:00
parent 9b768d647c
commit 7e537b680e
+87 -14
View File
@@ -11,22 +11,26 @@ import org.gradle.api.artifacts.type.ArtifactTypeDefinition
import org.gradle.api.attributes.Attribute import org.gradle.api.attributes.Attribute
import org.gradle.api.attributes.LibraryElements import org.gradle.api.attributes.LibraryElements
import org.gradle.api.attributes.java.TargetJvmEnvironment import org.gradle.api.attributes.java.TargetJvmEnvironment
import org.gradle.api.attributes.java.TargetJvmVersion
import org.gradle.api.attributes.plugin.GradlePluginApiVersion import org.gradle.api.attributes.plugin.GradlePluginApiVersion
import org.gradle.api.file.FileCollection import org.gradle.api.file.FileCollection
import org.gradle.api.component.AdhocComponentWithVariants
import org.gradle.api.plugins.JavaLibraryPlugin import org.gradle.api.plugins.JavaLibraryPlugin
import org.gradle.api.plugins.JavaPlugin
import org.gradle.api.plugins.JavaPluginExtension import org.gradle.api.plugins.JavaPluginExtension
import org.gradle.api.publish.PublishingExtension import org.gradle.api.publish.PublishingExtension
import org.gradle.api.publish.maven.MavenPublication import org.gradle.api.publish.maven.MavenPublication
import org.gradle.api.tasks.Copy import org.gradle.api.tasks.Copy
import org.gradle.api.tasks.SourceSet import org.gradle.api.tasks.SourceSet
import org.gradle.api.tasks.compile.JavaCompile
import org.gradle.jvm.tasks.Jar import org.gradle.jvm.tasks.Jar
import org.gradle.kotlin.dsl.* import org.gradle.kotlin.dsl.*
import org.gradle.plugin.devel.plugins.JavaGradlePluginPlugin import org.gradle.plugin.devel.plugins.JavaGradlePluginPlugin
import org.jetbrains.dokka.DokkaVersion import org.jetbrains.dokka.DokkaVersion
import org.jetbrains.dokka.gradle.DokkaTask import org.jetbrains.dokka.gradle.DokkaTask
import org.jetbrains.kotlin.gradle.dsl.KotlinSingleTargetExtension import org.jetbrains.kotlin.gradle.dsl.KotlinSingleTargetExtension
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.jetbrains.kotlin.project.model.KotlinPlatformTypeAttribute
import plugins.configureDefaultPublishing import plugins.configureDefaultPublishing
import plugins.configureKotlinPomAttributes import plugins.configureKotlinPomAttributes
import java.util.* import java.util.*
@@ -240,6 +244,8 @@ fun Project.wireGradleVariantToCommonGradleVariant(
} }
} }
private const val FIXED_CONFIGURATION_SUFFIX = "WithFixedAttribute"
/** /**
* 'main' sources are used for minimal supported Gradle versions (6.7) up to Gradle 7.0. * 'main' sources are used for minimal supported Gradle versions (6.7) up to Gradle 7.0.
*/ */
@@ -287,9 +293,7 @@ fun Project.reconfigureMainSourcesSetForGradlePlugin(
} }
} }
if (kotlinBuildProperties.publishGradlePluginsJavadoc || if (kotlinBuildProperties.publishGradlePluginsJavadoc) {
kotlinBuildProperties.isTeamcityBuild
) {
plugins.withId("org.jetbrains.dokka") { plugins.withId("org.jetbrains.dokka") {
val dokkaTask = tasks.named<DokkaTask>("dokkaJavadoc") { val dokkaTask = tasks.named<DokkaTask>("dokkaJavadoc") {
dokkaSourceSets { dokkaSourceSets {
@@ -310,6 +314,67 @@ fun Project.reconfigureMainSourcesSetForGradlePlugin(
} }
} }
} }
val javaComponent = project.components["java"] as AdhocComponentWithVariants
// Workaround for https://youtrack.jetbrains.com/issue/KT-52987
listOf(
runtimeElementsConfigurationName,
apiElementsConfigurationName
)
.map { configurations[it] }
.forEach { originalConfiguration ->
configurations.create("${originalConfiguration.name}$FIXED_CONFIGURATION_SUFFIX") {
isCanBeResolved = originalConfiguration.isCanBeResolved
isCanBeConsumed = originalConfiguration.isCanBeConsumed
isVisible = originalConfiguration.isVisible
setExtendsFrom(originalConfiguration.extendsFrom)
artifacts {
originalConfiguration.artifacts.forEach {
add(name, it)
}
}
// Removing 'org.jetbrains.kotlin.platform.type' attribute
// as it brings issues with Gradle variant resolve on Gradle 7.6+ versions
attributes {
originalConfiguration.attributes.keySet()
.filter { it.name != KotlinPlatformType.attribute.name }
.forEach { originalAttribute ->
@Suppress("UNCHECKED_CAST")
attribute(
originalAttribute as Attribute<Any>,
originalConfiguration.attributes.getAttribute(originalAttribute)!!
)
}
plugins.withType<JavaPlugin> {
tasks.named<JavaCompile>(compileJavaTaskName) {
attribute(
TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE,
targetCompatibility.toInt()
)
}
}
}
javaComponent.addVariantsFromConfiguration(this) {
if (originalConfiguration.name.startsWith("api")) {
mapToMavenScope("compile")
} else {
mapToMavenScope("runtime")
}
}
// Make original configuration unpublishable and not visible
originalConfiguration.isCanBeConsumed = false
originalConfiguration.isVisible = false
javaComponent.withVariantsFromConfiguration(originalConfiguration) {
skip()
}
}
}
} }
// Fix common sources visibility for tests // Fix common sources visibility for tests
@@ -443,10 +508,6 @@ private fun Project.commonVariantAttributes(): Action<Configuration> = Action<Co
TargetJvmEnvironment.TARGET_JVM_ENVIRONMENT_ATTRIBUTE, TargetJvmEnvironment.TARGET_JVM_ENVIRONMENT_ATTRIBUTE,
objects.named(TargetJvmEnvironment.STANDARD_JVM) objects.named(TargetJvmEnvironment.STANDARD_JVM)
) )
attribute(
Attribute.of(KotlinPlatformTypeAttribute.uniqueName, String::class.java),
KotlinPlatformTypeAttribute.JVM
)
} }
} }
@@ -487,16 +548,28 @@ fun Project.publishShadowedJar(
} }
// Removing artifact produced by Jar task // Removing artifact produced by Jar task
configurations[sourceSet.runtimeElementsConfigurationName] if (sourceSet.name == SourceSet.MAIN_SOURCE_SET_NAME) {
.artifacts.removeAll { true } configurations["${sourceSet.runtimeElementsConfigurationName}$FIXED_CONFIGURATION_SUFFIX"]
configurations[sourceSet.apiElementsConfigurationName] .artifacts.removeAll { true }
.artifacts.removeAll { true } configurations["${sourceSet.apiElementsConfigurationName}$FIXED_CONFIGURATION_SUFFIX"]
.artifacts.removeAll { true }
} else {
configurations[sourceSet.runtimeElementsConfigurationName]
.artifacts.removeAll { true }
configurations[sourceSet.apiElementsConfigurationName]
.artifacts.removeAll { true }
}
// Adding instead artifact from shadow jar task // Adding instead artifact from shadow jar task
configurations { configurations {
artifacts { artifacts {
add(sourceSet.runtimeElementsConfigurationName, shadowJarTask) if (sourceSet.name == SourceSet.MAIN_SOURCE_SET_NAME) {
add(sourceSet.apiElementsConfigurationName, shadowJarTask) add("${sourceSet.runtimeElementsConfigurationName}$FIXED_CONFIGURATION_SUFFIX", shadowJarTask)
add("${sourceSet.apiElementsConfigurationName}$FIXED_CONFIGURATION_SUFFIX", shadowJarTask)
} else {
add(sourceSet.apiElementsConfigurationName, shadowJarTask)
add(sourceSet.runtimeElementsConfigurationName, shadowJarTask)
}
} }
} }
} }