summaryrefslogtreecommitdiff
path: root/build-system/gradle-core/src/main/java/com/android/build/gradle/internal/scope/ArtifactPublishingUtil.kt
diff options
context:
space:
mode:
Diffstat (limited to 'build-system/gradle-core/src/main/java/com/android/build/gradle/internal/scope/ArtifactPublishingUtil.kt')
-rw-r--r--build-system/gradle-core/src/main/java/com/android/build/gradle/internal/scope/ArtifactPublishingUtil.kt112
1 files changed, 112 insertions, 0 deletions
diff --git a/build-system/gradle-core/src/main/java/com/android/build/gradle/internal/scope/ArtifactPublishingUtil.kt b/build-system/gradle-core/src/main/java/com/android/build/gradle/internal/scope/ArtifactPublishingUtil.kt
index 6d365ebe81..d2b1dd315e 100644
--- a/build-system/gradle-core/src/main/java/com/android/build/gradle/internal/scope/ArtifactPublishingUtil.kt
+++ b/build-system/gradle-core/src/main/java/com/android/build/gradle/internal/scope/ArtifactPublishingUtil.kt
@@ -17,11 +17,21 @@
@file:JvmName("ArtifactPublishingUtil")
package com.android.build.gradle.internal.scope
+import com.android.build.gradle.internal.component.ComponentCreationConfig
import com.android.build.gradle.internal.dependency.AndroidAttributes
import com.android.build.gradle.internal.publishing.AndroidArtifacts
+import com.android.build.gradle.internal.publishing.PublishedConfigSpec
+import com.android.build.gradle.internal.publishing.PublishingSpecs
+import com.android.build.gradle.internal.publishing.VariantPublishingInfo
+import com.android.build.gradle.internal.testFixtures.testFixturesClassifier
+import com.google.common.base.Preconditions
import org.gradle.api.NamedDomainObjectContainer
import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.ConfigurationVariant
+import org.gradle.api.attributes.DocsType
+import org.gradle.api.attributes.LibraryElements
+import org.gradle.api.file.FileSystemLocation
+import org.gradle.api.provider.Provider
/**
* Publish an artifact to a configuration.
@@ -86,3 +96,105 @@ private fun getConfigurationVariantName(
return artifactType.type + (attributes?.toAttributeMapString() ?: "")
}
+/** Publish intermediate artifacts in the BuildArtifactsHolder based on PublishingSpecs. */
+fun publishBuildArtifacts(
+ creationConfig: ComponentCreationConfig,
+ publishInfo: VariantPublishingInfo?
+) {
+ for (outputSpec in PublishingSpecs.getVariantPublishingSpec(creationConfig.componentType).outputs) {
+ val buildArtifactType = outputSpec.outputType
+ // Gradle only support publishing single file. Therefore, unless Gradle starts
+ // supporting publishing multiple files, PublishingSpecs should not contain any
+ // OutputSpec with an appendable ArtifactType.
+ if (BuildArtifactSpec.has(buildArtifactType) && BuildArtifactSpec.get(buildArtifactType).appendable) {
+ throw RuntimeException(
+ "Appendable ArtifactType '${buildArtifactType.name()}' cannot be published."
+ )
+ }
+ val artifactProvider = creationConfig.artifacts.get(buildArtifactType)
+ val artifactContainer = creationConfig.artifacts.getArtifactContainer(buildArtifactType)
+ if (!artifactContainer.needInitialProducer().get()) {
+ val isPublicationConfigs =
+ outputSpec.publishedConfigTypes.any { it.isPublicationConfig }
+
+ if (isPublicationConfigs) {
+ val components = publishInfo!!.components
+ for(component in components) {
+ publishIntermediateArtifact(
+ creationConfig,
+ artifactProvider,
+ outputSpec.artifactType,
+ outputSpec.publishedConfigTypes.map {
+ PublishedConfigSpec(it, component) }.toSet(),
+ outputSpec.libraryElements?.let {
+ creationConfig.services.named(LibraryElements::class.java, it)
+ }
+ )
+ }
+ } else {
+ publishIntermediateArtifact(
+ creationConfig,
+ artifactProvider,
+ outputSpec.artifactType,
+ outputSpec.publishedConfigTypes.map { PublishedConfigSpec(it) }.toSet(),
+ outputSpec.libraryElements?.let {
+ creationConfig.services.named(LibraryElements::class.java, it)
+ }
+ )
+ }
+ }
+ }
+}
+
+/**
+ * Publish an intermediate artifact.
+ *
+ * @param artifact Provider of File or FileSystemLocation to be published.
+ * @param artifactType the artifact type.
+ * @param configSpecs the PublishedConfigSpec.
+ * @param libraryElements the artifact's library elements
+ */
+private fun publishIntermediateArtifact(
+ creationConfig: ComponentCreationConfig,
+ artifact: Provider<out FileSystemLocation>,
+ artifactType: AndroidArtifacts.ArtifactType,
+ configSpecs: Set<PublishedConfigSpec>,
+ libraryElements: LibraryElements?
+) {
+ Preconditions.checkState(configSpecs.isNotEmpty())
+ for (configSpec in configSpecs) {
+ val config = creationConfig.variantDependencies.getElements(configSpec)
+ val configType = configSpec.configType
+ if (config != null) {
+ if (configType.isPublicationConfig) {
+ var classifier: String? = null
+ val isSourcePublication = configType == AndroidArtifacts.PublishedConfigType.SOURCE_PUBLICATION
+ val isJavaDocPublication =
+ configType == AndroidArtifacts.PublishedConfigType.JAVA_DOC_PUBLICATION
+ if (configSpec.isClassifierRequired) {
+ classifier = if (isSourcePublication) {
+ creationConfig.name + "-" + DocsType.SOURCES
+ } else if (isJavaDocPublication) {
+ creationConfig.name + "-" + DocsType.JAVADOC
+ } else {
+ creationConfig.name
+ }
+ } else if (creationConfig.componentType.isTestFixturesComponent) {
+ classifier = testFixturesClassifier
+ } else if (isSourcePublication) {
+ classifier = DocsType.SOURCES
+ } else if (isJavaDocPublication) {
+ classifier = DocsType.JAVADOC
+ }
+ publishArtifactToDefaultVariant(config, artifact, artifactType, classifier)
+ } else {
+ publishArtifactToConfiguration(
+ config,
+ artifact,
+ artifactType,
+ AndroidAttributes(null, libraryElements)
+ )
+ }
+ }
+ }
+}