Publish multiplatform resources in for jvm target
^KT-65540
This commit is contained in:
committed by
Space Team
parent
3dd33e5aa7
commit
370799b4e3
+38
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2024 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.mpp.resources.publication
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.KotlinProjectSetupAction
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.mpp.resources.assembleHierarchicalResources
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.mpp.resources.resourcesPublicationExtension
|
||||||
|
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
|
||||||
|
|
||||||
|
|
||||||
|
internal val SetUpMultiplatformJvmResourcesPublicationAction = KotlinProjectSetupAction {
|
||||||
|
if (!kotlinPropertiesProvider.mppResourcesPublication) return@KotlinProjectSetupAction
|
||||||
|
|
||||||
|
multiplatformExtension.targets.all { target ->
|
||||||
|
if (target is KotlinJvmTarget) {
|
||||||
|
target.setUpMultiplatformResourcesAndAssets()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun KotlinJvmTarget.setUpMultiplatformResourcesAndAssets() {
|
||||||
|
project.multiplatformExtension.resourcesPublicationExtension?.subscribeOnPublishResources(
|
||||||
|
this
|
||||||
|
) { resources ->
|
||||||
|
val mainCompilation = compilations.getByName(KotlinCompilation.MAIN_COMPILATION_NAME)
|
||||||
|
val copyResourcesTask = mainCompilation.assembleHierarchicalResources(
|
||||||
|
targetName,
|
||||||
|
resources,
|
||||||
|
)
|
||||||
|
mainCompilation.defaultSourceSet.resources.srcDir(copyResourcesTask)
|
||||||
|
}
|
||||||
|
}
|
||||||
+2
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.apple.XcodeVersionSetupAction
|
|||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.*
|
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.*
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.internal.DeprecatedMppGradlePropertiesMigrationSetupAction
|
import org.jetbrains.kotlin.gradle.plugin.mpp.internal.DeprecatedMppGradlePropertiesMigrationSetupAction
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.resources.RegisterMultiplatformResourcesPublicationExtensionAction
|
import org.jetbrains.kotlin.gradle.plugin.mpp.resources.RegisterMultiplatformResourcesPublicationExtensionAction
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.mpp.resources.publication.SetUpMultiplatformJvmResourcesPublicationAction
|
||||||
import org.jetbrains.kotlin.gradle.plugin.sources.KotlinMultiplatformSourceSetSetupAction
|
import org.jetbrains.kotlin.gradle.plugin.sources.KotlinMultiplatformSourceSetSetupAction
|
||||||
import org.jetbrains.kotlin.gradle.plugin.sources.LanguageSettingsSetupAction
|
import org.jetbrains.kotlin.gradle.plugin.sources.LanguageSettingsSetupAction
|
||||||
import org.jetbrains.kotlin.gradle.plugin.statistics.MultiplatformBuildStatsReportSetupAction
|
import org.jetbrains.kotlin.gradle.plugin.statistics.MultiplatformBuildStatsReportSetupAction
|
||||||
@@ -82,6 +83,7 @@ internal fun Project.registerKotlinPluginExtensions() {
|
|||||||
register(project, ExcludeDefaultPlatformDependenciesFromKotlinNativeCompileTasks)
|
register(project, ExcludeDefaultPlatformDependenciesFromKotlinNativeCompileTasks)
|
||||||
register(project, SetupConsistentMetadataDependenciesResolution)
|
register(project, SetupConsistentMetadataDependenciesResolution)
|
||||||
register(project, RegisterMultiplatformResourcesPublicationExtensionAction)
|
register(project, RegisterMultiplatformResourcesPublicationExtensionAction)
|
||||||
|
register(project, SetUpMultiplatformJvmResourcesPublicationAction)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+84
@@ -0,0 +1,84 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2024 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.unitTests
|
||||||
|
|
||||||
|
import org.gradle.api.Project
|
||||||
|
import org.gradle.api.file.FileCollection
|
||||||
|
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.mpp.resources.KotlinTargetResourcesPublication
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.mpp.resources.resourcesPublicationExtension
|
||||||
|
import org.jetbrains.kotlin.gradle.util.buildProjectWithMPP
|
||||||
|
import org.jetbrains.kotlin.gradle.util.kotlin
|
||||||
|
import org.junit.Test
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
class KotlinJvmTargetResourcesPublicationTests {
|
||||||
|
|
||||||
|
private val Project.expectedResourcePath get() = layout.buildDirectory.dir(
|
||||||
|
"kotlin-multiplatform-resources/assemble-hierarchically/jvm"
|
||||||
|
).get().asFile
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test publishing jvm resources - reflects in jvm resource directories`() {
|
||||||
|
val project = buildProjectWithMPP {
|
||||||
|
kotlin {
|
||||||
|
jvm()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
project.evaluate()
|
||||||
|
project.publishFakeResources(
|
||||||
|
project.multiplatformExtension.jvm()
|
||||||
|
)
|
||||||
|
|
||||||
|
val actualSourcesDirectories = project.multiplatformExtension.jvm()
|
||||||
|
.compilations.getByName("main")
|
||||||
|
.defaultSourceSet.resources.sourceDirectories
|
||||||
|
|
||||||
|
assert(
|
||||||
|
actualSourcesDirectories.contains(project.expectedResourcePath)
|
||||||
|
) { actualSourcesDirectories.dumpPaths() }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test publishing jvm resources - doesn't show up in resources - when there is no publication`() {
|
||||||
|
val project = buildProjectWithMPP {
|
||||||
|
kotlin {
|
||||||
|
jvm()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
project.evaluate()
|
||||||
|
|
||||||
|
val actualSourcesDirectories = project.multiplatformExtension.jvm()
|
||||||
|
.compilations.getByName("main")
|
||||||
|
.defaultSourceSet.resources.sourceDirectories
|
||||||
|
|
||||||
|
assert(
|
||||||
|
!actualSourcesDirectories.contains(project.expectedResourcePath)
|
||||||
|
) { actualSourcesDirectories.dumpPaths() }
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun Project.publishFakeResources(target: KotlinTarget) {
|
||||||
|
project.multiplatformExtension.resourcesPublicationExtension?.publishResourcesAsKotlinComponent(
|
||||||
|
target,
|
||||||
|
resourcePathForSourceSet = {
|
||||||
|
KotlinTargetResourcesPublication.ResourceRoot(
|
||||||
|
project.provider { File(it.name) },
|
||||||
|
emptyList(),
|
||||||
|
emptyList(),
|
||||||
|
)
|
||||||
|
},
|
||||||
|
relativeResourcePlacement = project.provider { File("test") },
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun FileCollection.dumpPaths(): String {
|
||||||
|
return "Actual paths:" + if (isEmpty) " <Empty>" else joinToString("") { "\n${it.path}" }
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+71
-33
@@ -6,12 +6,15 @@
|
|||||||
package org.jetbrains.kotlin.gradle.unitTests
|
package org.jetbrains.kotlin.gradle.unitTests
|
||||||
|
|
||||||
import org.gradle.api.Project
|
import org.gradle.api.Project
|
||||||
|
import org.gradle.api.internal.project.ProjectInternal
|
||||||
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
|
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
|
||||||
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
|
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
|
||||||
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics
|
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.diagnostics.ToolingDiagnosticFactory
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.resources.KotlinTargetResourcesPublication
|
import org.jetbrains.kotlin.gradle.plugin.mpp.resources.KotlinTargetResourcesPublication
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.resources.resourcesPublicationExtension
|
import org.jetbrains.kotlin.gradle.plugin.mpp.resources.resourcesPublicationExtension
|
||||||
import org.jetbrains.kotlin.gradle.util.assertContainsDiagnostic
|
import org.jetbrains.kotlin.gradle.util.assertContainsDiagnostic
|
||||||
|
import org.jetbrains.kotlin.gradle.util.assertNoDiagnostics
|
||||||
import org.jetbrains.kotlin.gradle.util.buildProjectWithMPP
|
import org.jetbrains.kotlin.gradle.util.buildProjectWithMPP
|
||||||
import org.jetbrains.kotlin.gradle.util.kotlin
|
import org.jetbrains.kotlin.gradle.util.kotlin
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
@@ -29,21 +32,14 @@ class KotlinTargetResourcesPublicationImplTests {
|
|||||||
}
|
}
|
||||||
val target = project.multiplatformExtension.jvm()
|
val target = project.multiplatformExtension.jvm()
|
||||||
|
|
||||||
var callbacks = 0
|
testCallbacksAfterApiCall(
|
||||||
project.publishFakeResources(target)
|
callback = { back ->
|
||||||
project.multiplatformExtension.resourcesPublicationExtension?.subscribeOnPublishResources(
|
project.multiplatformExtension.resourcesPublicationExtension?.subscribeOnPublishResources(target) {
|
||||||
target
|
back(Unit)
|
||||||
) {
|
}
|
||||||
callbacks += 1
|
},
|
||||||
}
|
apiCall = { project.publishFakeResources(target) }
|
||||||
assertEquals(callbacks, 1)
|
)
|
||||||
|
|
||||||
project.multiplatformExtension.resourcesPublicationExtension?.subscribeOnPublishResources(
|
|
||||||
target
|
|
||||||
) {
|
|
||||||
callbacks += 1
|
|
||||||
}
|
|
||||||
assertEquals(callbacks, 2)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -55,21 +51,14 @@ class KotlinTargetResourcesPublicationImplTests {
|
|||||||
}
|
}
|
||||||
val target = project.multiplatformExtension.jvm()
|
val target = project.multiplatformExtension.jvm()
|
||||||
|
|
||||||
var callbacks = 0
|
testCallbacksBeforeAndAfterApiCall(
|
||||||
project.multiplatformExtension.resourcesPublicationExtension?.subscribeOnPublishResources(
|
callback = { back ->
|
||||||
target
|
project.multiplatformExtension.resourcesPublicationExtension?.subscribeOnPublishResources(target) {
|
||||||
) {
|
back(Unit)
|
||||||
callbacks += 1
|
}
|
||||||
}
|
},
|
||||||
project.publishFakeResources(target)
|
apiCall = { project.publishFakeResources(target) }
|
||||||
assertEquals(callbacks, 1)
|
)
|
||||||
|
|
||||||
project.multiplatformExtension.resourcesPublicationExtension?.subscribeOnPublishResources(
|
|
||||||
target
|
|
||||||
) {
|
|
||||||
callbacks += 1
|
|
||||||
}
|
|
||||||
assertEquals(callbacks, 2)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -81,10 +70,59 @@ class KotlinTargetResourcesPublicationImplTests {
|
|||||||
}
|
}
|
||||||
val target = project.multiplatformExtension.jvm()
|
val target = project.multiplatformExtension.jvm()
|
||||||
|
|
||||||
project.publishFakeResources(target)
|
project.testMultipleApiCallsEmitDiagnostic(
|
||||||
project.publishFakeResources(target)
|
apiCall = { project.publishFakeResources(target) },
|
||||||
|
diagnostic = KotlinToolingDiagnostics.ResourcePublishedMoreThanOncePerTarget,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
project.assertContainsDiagnostic(KotlinToolingDiagnostics.ResourcePublishedMoreThanOncePerTarget)
|
private fun testCallbacksAfterApiCall(
|
||||||
|
callback: ((Unit) -> Unit) -> Unit,
|
||||||
|
apiCall: (Unit) -> Unit,
|
||||||
|
) {
|
||||||
|
var callbacks = 0
|
||||||
|
|
||||||
|
apiCall.invoke(Unit)
|
||||||
|
callback {
|
||||||
|
callbacks += 1
|
||||||
|
}
|
||||||
|
assertEquals(callbacks, 1)
|
||||||
|
|
||||||
|
callback {
|
||||||
|
callbacks += 1
|
||||||
|
}
|
||||||
|
assertEquals(callbacks, 2)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun testCallbacksBeforeAndAfterApiCall(
|
||||||
|
callback: ((Unit) -> Unit) -> Unit,
|
||||||
|
apiCall: (Unit) -> Unit,
|
||||||
|
) {
|
||||||
|
var callbacks = 0
|
||||||
|
|
||||||
|
callback {
|
||||||
|
callbacks += 1
|
||||||
|
}
|
||||||
|
assertEquals(callbacks, 0)
|
||||||
|
|
||||||
|
apiCall.invoke(Unit)
|
||||||
|
assertEquals(callbacks, 1)
|
||||||
|
|
||||||
|
callback {
|
||||||
|
callbacks += 1
|
||||||
|
}
|
||||||
|
assertEquals(callbacks, 2)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun ProjectInternal.testMultipleApiCallsEmitDiagnostic(
|
||||||
|
apiCall: (Unit) -> Unit,
|
||||||
|
diagnostic: ToolingDiagnosticFactory,
|
||||||
|
) {
|
||||||
|
assertNoDiagnostics(diagnostic)
|
||||||
|
apiCall(Unit)
|
||||||
|
assertNoDiagnostics(diagnostic)
|
||||||
|
apiCall(Unit)
|
||||||
|
assertContainsDiagnostic(diagnostic)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun Project.publishFakeResources(target: KotlinTarget) {
|
private fun Project.publishFakeResources(target: KotlinTarget) {
|
||||||
|
|||||||
Reference in New Issue
Block a user