[Gradle] Access the artifact type attribute via non-deprecated API

#KT-54447 Fixed
This commit is contained in:
Alexander.Likhachev
2023-03-14 15:55:36 +01:00
committed by Space Team
parent 2de4f471e9
commit 67fc9be3c5
11 changed files with 122 additions and 12 deletions
@@ -162,6 +162,11 @@ abstract class DefaultKotlinBasePlugin : KotlinBasePlugin {
KotlinTestReportCompatibilityHelper.KotlinTestReportCompatibilityHelperVariantFactory::class,
DefaultKotlinTestReportCompatibilityHelperVariantFactory()
)
factories.putIfAbsent(
ArtifactTypeAttributeAccessor.ArtifactTypeAttributeAccessorVariantFactory::class,
DefaultArtifactTypeAttributeAccessorVariantFactory()
)
}
protected fun setupAttributeMatchingStrategy(
@@ -16,7 +16,6 @@ import org.gradle.api.artifacts.type.ArtifactTypeDefinition
import org.gradle.api.attributes.*
import org.gradle.api.attributes.Usage.USAGE_ATTRIBUTE
import org.gradle.api.file.FileCollection
import org.gradle.api.internal.artifacts.ArtifactAttributes
import org.gradle.api.plugins.BasePlugin
import org.gradle.api.plugins.ExtensionAware
import org.gradle.api.plugins.JavaBasePlugin
@@ -26,6 +25,7 @@ import org.gradle.api.tasks.bundling.Zip
import org.gradle.language.base.plugins.LifecycleBasePlugin
import org.gradle.language.jvm.tasks.ProcessResources
import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions
import org.jetbrains.kotlin.gradle.plugin.internal.artifactTypeAttribute
import org.jetbrains.kotlin.gradle.plugin.mpp.*
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsCompilerAttribute
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget
@@ -336,25 +336,25 @@ abstract class KotlinOnlyTargetConfigurator<KotlinCompilationType : KotlinCompil
val apiElementsConfiguration = project.configurations.getByName(target.apiElementsConfigurationName)
// If the target adds its own artifact to this configuration until this happens, don't add another one:
addJarIfNoArtifactsPresent(apiElementsConfiguration, jarArtifact)
addJarIfNoArtifactsPresent(project, apiElementsConfiguration, jarArtifact)
if (mainCompilation is KotlinCompilationToRunnableFiles<*>) {
val runtimeConfiguration = mainCompilation.internal.configurations.deprecatedRuntimeConfiguration
val runtimeElementsConfiguration = project.configurations.getByName(target.runtimeElementsConfigurationName)
runtimeConfiguration?.let { addJarIfNoArtifactsPresent(runtimeConfiguration, jarArtifact) }
addJarIfNoArtifactsPresent(runtimeElementsConfiguration, jarArtifact)
runtimeConfiguration?.let { addJarIfNoArtifactsPresent(project, runtimeConfiguration, jarArtifact) }
addJarIfNoArtifactsPresent(project, runtimeElementsConfiguration, jarArtifact)
}
}
}
}
private fun addJarIfNoArtifactsPresent(configuration: Configuration, jarArtifact: PublishArtifact) {
private fun addJarIfNoArtifactsPresent(project: Project, configuration: Configuration, jarArtifact: PublishArtifact) {
if (configuration.artifacts.isEmpty()) {
val publications = configuration.outgoing
// Configure an implicit variant
publications.artifacts.add(jarArtifact)
publications.attributes.attribute(ArtifactAttributes.ARTIFACT_FORMAT, archiveType)
publications.attributes.attribute(project.artifactTypeAttribute, archiveType)
}
}
}
@@ -0,0 +1,39 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.gradle.plugin.internal
import org.gradle.api.Project
import org.gradle.api.artifacts.type.ArtifactTypeDefinition
import org.gradle.api.attributes.Attribute
import org.jetbrains.kotlin.gradle.plugin.VariantImplementationFactories
import org.jetbrains.kotlin.gradle.plugin.variantImplementationFactory
/**
* Gradle 7.3 introduced the artifact type attribute as a part of public API.
* The old API is now deprecated, so we continue using it only for old Gradle versions
*/
interface ArtifactTypeAttributeAccessor {
val artifactTypeAttribute: Attribute<String>
interface ArtifactTypeAttributeAccessorVariantFactory : VariantImplementationFactories.VariantImplementationFactory {
fun getInstance(): ArtifactTypeAttributeAccessor
}
}
internal class DefaultArtifactTypeAttributeAccessorVariantFactory :
ArtifactTypeAttributeAccessor.ArtifactTypeAttributeAccessorVariantFactory {
override fun getInstance() = DefaultArtifactTypeAttributeAccessor()
}
internal class DefaultArtifactTypeAttributeAccessor : ArtifactTypeAttributeAccessor {
override val artifactTypeAttribute: Attribute<String>
get() = ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE
}
internal val Project.artifactTypeAttribute
get() = variantImplementationFactory<ArtifactTypeAttributeAccessor.ArtifactTypeAttributeAccessorVariantFactory>()
.getInstance()
.artifactTypeAttribute
@@ -17,7 +17,6 @@ import org.gradle.api.attributes.AttributeContainer
import org.gradle.api.attributes.Category
import org.gradle.api.attributes.Usage
import org.gradle.api.attributes.Usage.USAGE_ATTRIBUTE
import org.gradle.api.internal.artifacts.ArtifactAttributes
import org.gradle.api.internal.plugins.DefaultArtifactPublicationSet
import org.gradle.api.plugins.BasePlugin
import org.gradle.api.provider.Provider
@@ -28,6 +27,7 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinNativeCompilerOptions
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation.Companion.TEST_COMPILATION_NAME
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationInfo.KPM
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.KOTLIN_NATIVE_IGNORE_INCORRECT_DEPENDENCIES
import org.jetbrains.kotlin.gradle.plugin.internal.artifactTypeAttribute
import org.jetbrains.kotlin.gradle.plugin.mpp.*
import org.jetbrains.kotlin.gradle.plugin.mpp.apple.registerEmbedAndSignAppleFrameworkTask
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmVariant
@@ -125,7 +125,7 @@ open class KotlinNativeTargetConfigurator<T : KotlinNativeTarget> : AbstractKotl
artifacts.add(linkArtifact)
attributes.attribute(KotlinPlatformType.attribute, binary.target.platformType)
attributes.attribute(
ArtifactAttributes.ARTIFACT_FORMAT,
project.artifactTypeAttribute,
NativeArtifactFormat.FRAMEWORK
)
attributes.attribute(
@@ -303,7 +303,7 @@ open class KotlinNativeTargetConfigurator<T : KotlinNativeTarget> : AbstractKotl
val apiElements = configurations.getByName(target.apiElementsConfigurationName)
apiElements.outgoing.attributes.attribute(ArtifactAttributes.ARTIFACT_FORMAT, NativeArtifactFormat.KLIB)
apiElements.outgoing.attributes.attribute(artifactTypeAttribute, NativeArtifactFormat.KLIB)
if (project.isKotlinGranularMetadataEnabled) {
project.configurations.create(target.hostSpecificMetadataElementsConfigurationName) { configuration ->
@@ -580,7 +580,7 @@ open class KotlinNativeTargetConfigurator<T : KotlinNativeTarget> : AbstractKotl
}
project.project.extensions.getByType(DefaultArtifactPublicationSet::class.java).addCandidate(klibArtifact)
artifacts.add(klibArtifact)
attributes.attribute(ArtifactAttributes.ARTIFACT_FORMAT, NativeArtifactFormat.KLIB)
attributes.attribute(project.artifactTypeAttribute, NativeArtifactFormat.KLIB)
}
}
}
@@ -8,11 +8,11 @@ package org.jetbrains.kotlin.gradle.targets.native.internal
import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration
import org.gradle.api.attributes.*
import org.gradle.api.internal.artifacts.ArtifactAttributes
import org.gradle.api.tasks.TaskProvider
import org.jetbrains.kotlin.gradle.plugin.KotlinNativeTargetConfigurator.NativeArtifactFormat
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
import org.jetbrains.kotlin.gradle.plugin.categoryByName
import org.jetbrains.kotlin.gradle.plugin.internal.artifactTypeAttribute
import org.jetbrains.kotlin.gradle.plugin.mpp.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.copyAttributes
import org.jetbrains.kotlin.gradle.plugin.usesPlatformOf
@@ -80,7 +80,7 @@ internal fun Project.locateOrCreateCInteropApiElementsConfiguration(target: Kotl
attributes.attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, cinteropKlibLibraryElements())
attributes.attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage::class.java, KotlinUsages.KOTLIN_CINTEROP))
attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY))
attributes.attribute(ArtifactAttributes.ARTIFACT_FORMAT, NativeArtifactFormat.KLIB)
attributes.attribute(artifactTypeAttribute, NativeArtifactFormat.KLIB)
}
}
}
@@ -149,4 +149,6 @@ private fun Project.registerVariantImplementations() {
MppTestReportHelperG70.MppTestReportHelperVariantFactoryG70()
factories[KotlinTestReportCompatibilityHelper.KotlinTestReportCompatibilityHelperVariantFactory::class] =
KotlinTestReportCompatibilityHelperG70.KotlinTestReportCompatibilityHelperVariantFactoryG70()
factories[ArtifactTypeAttributeAccessor.ArtifactTypeAttributeAccessorVariantFactory::class] =
ArtifactTypeAttributeAccessorG70.ArtifactTypeAttributeAccessorVariantFactoryG70()
}
@@ -0,0 +1,20 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.gradle.plugin.internal
import org.gradle.api.attributes.Attribute
import org.gradle.api.internal.artifacts.ArtifactAttributes
internal class ArtifactTypeAttributeAccessorG70(
) : ArtifactTypeAttributeAccessor {
override val artifactTypeAttribute: Attribute<String>
get() = ArtifactAttributes.ARTIFACT_FORMAT
internal class ArtifactTypeAttributeAccessorVariantFactoryG70 :
ArtifactTypeAttributeAccessor.ArtifactTypeAttributeAccessorVariantFactory {
override fun getInstance(): ArtifactTypeAttributeAccessor = ArtifactTypeAttributeAccessorG70()
}
}
@@ -150,4 +150,6 @@ private fun Project.registerVariantImplementations() {
MppTestReportHelperG71.MppTestReportHelperVariantFactoryG71()
factories[KotlinTestReportCompatibilityHelper.KotlinTestReportCompatibilityHelperVariantFactory::class] =
KotlinTestReportCompatibilityHelperG71.KotlinTestReportCompatibilityHelperVariantFactoryG71()
factories[ArtifactTypeAttributeAccessor.ArtifactTypeAttributeAccessorVariantFactory::class] =
ArtifactTypeAttributeAccessorG71.ArtifactTypeAttributeAccessorVariantFactoryG71()
}
@@ -0,0 +1,20 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.gradle.plugin.internal
import org.gradle.api.attributes.Attribute
import org.gradle.api.internal.artifacts.ArtifactAttributes
internal class ArtifactTypeAttributeAccessorG71(
) : ArtifactTypeAttributeAccessor {
override val artifactTypeAttribute: Attribute<String>
get() = ArtifactAttributes.ARTIFACT_FORMAT
internal class ArtifactTypeAttributeAccessorVariantFactoryG71 :
ArtifactTypeAttributeAccessor.ArtifactTypeAttributeAccessorVariantFactory {
override fun getInstance(): ArtifactTypeAttributeAccessor = ArtifactTypeAttributeAccessorG71()
}
}
@@ -155,4 +155,6 @@ private fun Project.registerVariantImplementations() {
MppTestReportHelperG6.MppTestReportHelperVariantFactoryG6()
factories[KotlinTestReportCompatibilityHelper.KotlinTestReportCompatibilityHelperVariantFactory::class] =
KotlinTestReportCompatibilityHelperG6.KotlinTestReportCompatibilityHelperVariantFactoryG6()
factories[ArtifactTypeAttributeAccessor.ArtifactTypeAttributeAccessorVariantFactory::class] =
ArtifactTypeAttributeAccessorG6.ArtifactTypeAttributeAccessorVariantFactoryG6()
}
@@ -0,0 +1,20 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.gradle.plugin.internal
import org.gradle.api.attributes.Attribute
import org.gradle.api.internal.artifacts.ArtifactAttributes
internal class ArtifactTypeAttributeAccessorG6(
) : ArtifactTypeAttributeAccessor {
override val artifactTypeAttribute: Attribute<String>
get() = ArtifactAttributes.ARTIFACT_FORMAT
internal class ArtifactTypeAttributeAccessorVariantFactoryG6 :
ArtifactTypeAttributeAccessor.ArtifactTypeAttributeAccessorVariantFactory {
override fun getInstance(): ArtifactTypeAttributeAccessor = ArtifactTypeAttributeAccessorG6()
}
}