From 4fabe8b29a17523f71204df09c166b062f2ed5bb Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Tue, 28 Mar 2023 13:37:23 +0000 Subject: [PATCH] [Gradle, JS] Fix composite build to not depend package json task on full aggregated configuration ^KT-57604 fixed --- .../kotlin/gradle/Kotlin2JsGradlePluginIT.kt | 14 ++++ .../app/build.gradle.kts | 19 ++++++ .../app/src/main/kotlin/App.kt | 10 +++ .../app/src/test/kotlin/MyTest.kt | 14 ++++ .../build.gradle.kts | 13 ++++ .../lib/build.gradle.kts | 32 +++++++++ .../lib/src/main/kotlin/Lib.kt | 14 ++++ .../lib/src/main/kotlin/other/Lib.kt | 11 ++++ .../settings.gradle | 4 ++ .../targets/js/KotlinJsCompilerAttribute.kt | 2 - .../js/ir/KotlinJsIrCompilationFactory.kt | 6 ++ .../targets/js/npm/GradleNodeModuleBuilder.kt | 3 + .../KotlinCompilationNpmResolution.kt | 11 +--- .../resolver/KotlinCompilationNpmResolver.kt | 66 ++++++++++++++++++- .../js/npm/tasks/KotlinPackageJsonTask.kt | 28 ++++++-- 15 files changed, 228 insertions(+), 19 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-runtime-dependency/app/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-runtime-dependency/app/src/main/kotlin/App.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-runtime-dependency/app/src/test/kotlin/MyTest.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-runtime-dependency/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-runtime-dependency/lib/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-runtime-dependency/lib/src/main/kotlin/Lib.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-runtime-dependency/lib/src/main/kotlin/other/Lib.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-runtime-dependency/settings.gradle diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt index ff99d32865c..5f326df9a0e 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnLockCopyTask.Companion.YA import org.jetbrains.kotlin.gradle.tasks.USING_JS_INCREMENTAL_COMPILATION_MESSAGE import org.jetbrains.kotlin.gradle.tasks.USING_JS_IR_BACKEND_MESSAGE import org.jetbrains.kotlin.gradle.testbase.* +import org.jetbrains.kotlin.gradle.testbase.TestVersions.Gradle.G_7_6 import org.jetbrains.kotlin.gradle.util.jsCompilerType import org.jetbrains.kotlin.gradle.util.normalizePath import org.junit.jupiter.api.DisplayName @@ -81,6 +82,7 @@ class Kotlin2JsIrGradlePluginIT : AbstractKotlin2JsGradlePluginIT(true) { @DisplayName("js composite build works") @GradleTest + @GradleTestVersions(minVersion = G_7_6) fun testJsCompositeBuild(gradleVersion: GradleVersion) { project("js-composite-build", gradleVersion) { buildGradleKts.modify(::transformBuildScriptWithPluginsDsl) @@ -470,6 +472,18 @@ class Kotlin2JsIrGradlePluginIT : AbstractKotlin2JsGradlePluginIT(true) { assertEquals(fingerprints[0], fingerprints[1], "fingerprints must be stable") } } + + @DisplayName("Klib runtime dependency on module which already depends on dependent") + @GradleTest + fun testKlibRuntimeDependency(gradleVersion: GradleVersion) { + project("kotlin-js-ir-runtime-dependency", gradleVersion) { + build("assemble") { + assertTasksExecuted(":lib:otherKlib") + assertTasksExecuted(":lib:compileOtherKotlinJs") + assertTasksExecuted(":app:compileProductionExecutableKotlinJs") + } + } + } } @JsGradlePluginTests diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-runtime-dependency/app/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-runtime-dependency/app/build.gradle.kts new file mode 100644 index 00000000000..08900a3d671 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-runtime-dependency/app/build.gradle.kts @@ -0,0 +1,19 @@ +import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBinaryMode +import org.jetbrains.kotlin.gradle.targets.js.ir.JsIrBinary + +plugins { + kotlin("js") +} + +dependencies { + implementation(project(":lib")) + testImplementation(kotlin("test-js")) +} + +kotlin { + js { + browser { + } + binaries.executable() + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-runtime-dependency/app/src/main/kotlin/App.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-runtime-dependency/app/src/main/kotlin/App.kt new file mode 100644 index 00000000000..6b4e8fd8103 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-runtime-dependency/app/src/main/kotlin/App.kt @@ -0,0 +1,10 @@ +/* + * Copyright 2010-2019 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 com.example + +fun main() { + println("Sheldon: ${sheldon()}") +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-runtime-dependency/app/src/test/kotlin/MyTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-runtime-dependency/app/src/test/kotlin/MyTest.kt new file mode 100644 index 00000000000..2c48dc8941c --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-runtime-dependency/app/src/test/kotlin/MyTest.kt @@ -0,0 +1,14 @@ +/* + * 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. + */ + +import kotlin.test.Test +import kotlin.test.assertEquals + +class MainTest { + @Test + fun testHello() { + assertEquals(true, true) + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-runtime-dependency/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-runtime-dependency/build.gradle.kts new file mode 100644 index 00000000000..877c415742c --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-runtime-dependency/build.gradle.kts @@ -0,0 +1,13 @@ +plugins { + kotlin("js").apply(false) +} + +group = "com.example" +version = "1.0" + +allprojects { + repositories { + mavenLocal() + mavenCentral() + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-runtime-dependency/lib/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-runtime-dependency/lib/build.gradle.kts new file mode 100644 index 00000000000..d3f37b1f9c6 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-runtime-dependency/lib/build.gradle.kts @@ -0,0 +1,32 @@ +plugins { + kotlin("js") +} + +kotlin { + js { + val otherCompilation = compilations.create("other") + tasks.register("otherKlib") { + from(otherCompilation.output.allOutputs) + archiveExtension.set("klib") + } + + useCommonJs() + browser { + } + } + + sourceSets { + val main by getting { + kotlin.exclude("**/other/**") + dependencies { + runtimeOnly(files(tasks.named("otherKlib"))) + } + } + val other by getting { + kotlin.srcDirs("src/main/kotlin/other") + dependencies { + implementation(project(path = project.path)) + } + } + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-runtime-dependency/lib/src/main/kotlin/Lib.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-runtime-dependency/lib/src/main/kotlin/Lib.kt new file mode 100644 index 00000000000..c48221f2576 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-runtime-dependency/lib/src/main/kotlin/Lib.kt @@ -0,0 +1,14 @@ +/* + * Copyright 2010-2019 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 com.example + +fun answer(): Int { + return 42 +} + +fun sheldon(): Int { + return 73 +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-runtime-dependency/lib/src/main/kotlin/other/Lib.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-runtime-dependency/lib/src/main/kotlin/other/Lib.kt new file mode 100644 index 00000000000..939a28dbba2 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-runtime-dependency/lib/src/main/kotlin/other/Lib.kt @@ -0,0 +1,11 @@ +/* + * Copyright 2010-2019 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 com.example.other + +@JsExport +fun foo(): Int { + return 3 +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-runtime-dependency/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-runtime-dependency/settings.gradle new file mode 100644 index 00000000000..dcf75bc9be1 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-runtime-dependency/settings.gradle @@ -0,0 +1,4 @@ +rootProject.name = "kotlin-js-ir-runtime-dependency" + +include("lib") +include("app") \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilerAttribute.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilerAttribute.kt index 86266c2dc89..ffbfeea4f26 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilerAttribute.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilerAttribute.kt @@ -7,8 +7,6 @@ package org.jetbrains.kotlin.gradle.targets.js import org.gradle.api.Named import org.gradle.api.attributes.* -import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType -import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages import java.io.Serializable // For Gradle attributes diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilationFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilationFactory.kt index 82c90b66263..a6b4e34ab85 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilationFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilationFactory.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.gradle.targets.js.ir import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinCompilationFactory import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTarget +import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.DefaultKotlinCompilationFriendPathsResolver import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.JsIrCompilationSourceSetsContainerFactory import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.JsKotlinCompilationDependencyConfigurationsFactory import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.KotlinCompilationImplFactory @@ -20,6 +21,11 @@ class KotlinJsIrCompilationFactory internal constructor( private val compilationImplFactory: KotlinCompilationImplFactory = KotlinCompilationImplFactory( compilerOptionsFactory = KotlinJsCompilerOptionsFactory, + compilationFriendPathsResolver = DefaultKotlinCompilationFriendPathsResolver( + friendArtifactResolver = DefaultKotlinCompilationFriendPathsResolver.FriendArtifactResolver { _ -> + target.project.files() + } + ), compilationSourceSetsContainerFactory = JsIrCompilationSourceSetsContainerFactory, compilationDependencyConfigurationsFactory = JsKotlinCompilationDependencyConfigurationsFactory ) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModuleBuilder.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModuleBuilder.kt index e6de376c540..e36d7bd2ab5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModuleBuilder.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModuleBuilder.kt @@ -34,6 +34,9 @@ internal class GradleNodeModuleBuilder( srcFiles.forEach { srcFile -> when { isKotlinJsRuntimeFile(srcFile) -> files.add(srcFile) + srcFile.name == NpmProject.PACKAGE_JSON -> { + srcPackageJsonFile = srcFile + } srcFile.isCompatibleArchive -> { archiveOperations.zipTree(srcFile).forEach { innerFile -> when { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolution.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolution.kt index 5db0bfa7770..d3c4dfcaae1 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolution.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolution.kt @@ -8,13 +8,13 @@ package org.jetbrains.kotlin.gradle.targets.js.npm.resolver import org.gradle.api.logging.Logger import org.jetbrains.kotlin.gradle.targets.js.nodejs.TasksRequirements import org.jetbrains.kotlin.gradle.targets.js.npm.* -import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject.Companion.PACKAGE_JSON import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.PreparedKotlinCompilationNpmResolution import java.io.Serializable import java.io.File class KotlinCompilationNpmResolution( var internalDependencies: Collection, + var internalCompositeDependencies: Collection, var externalGradleDependencies: Collection, var externalNpmDependencies: Collection, var fileCollectionDependencies: Collection, @@ -171,13 +171,4 @@ class KotlinCompilationNpmResolution( } return direct + unique } - - internal fun CompositeDependency.getPackages(): List { - val packages = includedBuildDir.resolve(projectPackagesDir.relativeTo(rootDir)) - return packages - .list() - ?.map { packages.resolve(it) } - ?.map { it.resolve(PACKAGE_JSON) } - ?: emptyList() - } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt index d06d43a9b89..ecdbb61bea1 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt @@ -10,6 +10,7 @@ import org.gradle.api.artifacts.FileCollectionDependency import org.gradle.api.artifacts.ResolvedArtifact import org.gradle.api.artifacts.ResolvedDependency import org.gradle.api.artifacts.component.ProjectComponentIdentifier +import org.gradle.api.attributes.Attribute import org.gradle.api.attributes.Category import org.gradle.api.attributes.Usage import org.gradle.api.internal.artifacts.DefaultProjectComponentIdentifier @@ -78,6 +79,9 @@ class KotlinCompilationNpmResolver( it.npmProjectName.set(npmProject.name) it.npmProjectMain.set(npmProject.main) }.also { packageJsonTask -> + project.dependencies.attributesSchema { + it.attribute(publicPackageJsonAttribute) + } if (compilation.isMain()) { project.tasks .withType(Zip::class.java) @@ -85,7 +89,15 @@ class KotlinCompilationNpmResolver( .configure { it.dependsOn(packageJsonTask) } + + val publicPackageJsonConfiguration = createPublicPackageJsonConfiguration() + + target.project.artifacts.add(publicPackageJsonConfiguration.name, packageJsonTask.map { it.packageJsonFile }) { + it.builtBy(packageJsonTask) + } } + + } } @@ -119,6 +131,7 @@ class KotlinCompilationNpmResolver( all.usesPlatformOf(target) all.attributes.attribute(Usage.USAGE_ATTRIBUTE, KotlinUsages.consumerRuntimeUsage(target)) all.attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY)) + all.attributes.attribute(publicPackageJsonAttribute, PUBLIC_PACKAGE_JSON_ATTR_VALUE) all.isVisible = false all.isCanBeConsumed = false all.isCanBeResolved = true @@ -142,8 +155,23 @@ class KotlinCompilationNpmResolver( return all } + private fun createPublicPackageJsonConfiguration(): Configuration { + val all = project.configurations.create(compilation.disambiguateName("publicPackageJsonConfiguration")) + + all.usesPlatformOf(target) + all.attributes.attribute(Usage.USAGE_ATTRIBUTE, KotlinUsages.consumerRuntimeUsage(target)) + all.attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY)) + all.attributes.attribute(publicPackageJsonAttribute, PUBLIC_PACKAGE_JSON_ATTR_VALUE) + all.isVisible = false + all.isCanBeConsumed = true + all.isCanBeResolved = false + + return all + } + inner class ConfigurationVisitor { private val internalDependencies = mutableSetOf() + private val internalCompositeDependencies = mutableSetOf() private val externalGradleDependencies = mutableSetOf() private val externalNpmDependencies = mutableSetOf() private val fileCollectionDependencies = mutableSetOf() @@ -215,6 +243,10 @@ class KotlinCompilationNpmResolver( val artifactId = artifact.id val componentIdentifier = artifactId.componentIdentifier + if (artifactId `is` CompositeProjectComponentArtifactMetadata) { + visitCompositeProjectDependency(dependency, componentIdentifier as ProjectComponentIdentifier) + } + if (componentIdentifier is ProjectComponentIdentifier && !(artifactId `is` CompositeProjectComponentArtifactMetadata)) { visitProjectDependency(componentIdentifier) return @@ -223,6 +255,28 @@ class KotlinCompilationNpmResolver( externalGradleDependencies.add(ExternalGradleDependency(dependency, artifact)) } + private fun visitCompositeProjectDependency( + dependency: ResolvedDependency, + componentIdentifier: ProjectComponentIdentifier + ) { + check(target is KotlinJsIrTarget) { + """ + Composite builds for Kotlin/JS are supported only for IR compiler. + Use kotlin.js.compiler=ir in gradle.properties or + js(IR) { + ... + } + """.trimIndent() + } + + (componentIdentifier as DefaultProjectComponentIdentifier).let { identifier -> + val includedBuild = project.gradle.includedBuild(identifier.identityPath.topRealPath().name!!) + internalCompositeDependencies.add( + CompositeDependency(dependency.moduleName, dependency.moduleVersion, includedBuild.projectDir, includedBuild) + ) + } + } + private fun visitProjectDependency( componentIdentifier: ProjectComponentIdentifier ) { @@ -243,6 +297,7 @@ class KotlinCompilationNpmResolver( fun toPackageJsonProducer() = KotlinCompilationNpmResolution( internalDependencies, + internalCompositeDependencies, externalGradleDependencies.map { FileExternalGradleDependency( it.dependency.moduleName, @@ -264,4 +319,13 @@ class KotlinCompilationNpmResolver( rootResolver.tasksRequirements ) } -} + + companion object { + val publicPackageJsonAttribute = Attribute.of( + "org.jetbrains.kotlin.js.public.package.json", + String::class.java + ) + + const val PUBLIC_PACKAGE_JSON_ATTR_VALUE = "public-package-json" + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinPackageJsonTask.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinPackageJsonTask.kt index c6d0c1fe587..674962a59a6 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinPackageJsonTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinPackageJsonTask.kt @@ -6,7 +6,7 @@ package org.jetbrains.kotlin.gradle.targets.js.npm.tasks import org.gradle.api.DefaultTask -import org.gradle.api.file.FileCollection +import org.gradle.api.artifacts.component.ProjectComponentIdentifier import org.gradle.api.provider.Property import org.gradle.api.tasks.* import org.gradle.work.NormalizeLineEndings @@ -16,10 +16,10 @@ import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin.Companion.kotlinNodeJsExtension import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin.Companion.kotlinNpmResolutionManager import org.jetbrains.kotlin.gradle.targets.js.npm.* -import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.KotlinCompilationNpmResolver -import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.KotlinRootNpmResolver -import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.PackageJsonProducerInputs +import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.* import org.jetbrains.kotlin.gradle.tasks.registerTask +import org.jetbrains.kotlin.gradle.utils.CompositeProjectComponentArtifactMetadata +import org.jetbrains.kotlin.gradle.utils.`is` import java.io.File abstract class KotlinPackageJsonTask : @@ -41,6 +41,9 @@ abstract class KotlinPackageJsonTask : private fun findDependentTasks(): Collection = compilationResolver.compilationNpmResolution.internalDependencies.map { dependency -> nodeJs.resolver[dependency.projectPath][dependency.compilationName].npmProject.packageJsonTaskPath + } + compilationResolver.compilationNpmResolution.internalCompositeDependencies.map { dependency -> + dependency.includedBuild?.task(":$PACKAGE_JSON_UMBRELLA_TASK_NAME") ?: error("includedBuild instance is not available") + dependency.includedBuild.task(":${RootPackageJsonTask.NAME}") } // ----- @@ -75,8 +78,21 @@ abstract class KotlinPackageJsonTask : @get:NormalizeLineEndings @get:InputFiles @get:PathSensitive(PathSensitivity.RELATIVE) - internal val aggregatedConfiguration: FileCollection by lazy { - compilationResolver.aggregatedConfiguration + internal val compositeFiles: Set by lazy { + val map = compilationResolver.aggregatedConfiguration + .incoming + .artifactView { artifactView -> + artifactView.componentFilter { componentIdentifier -> + componentIdentifier is ProjectComponentIdentifier + } + } + .artifacts + .filter { + it.id `is` CompositeProjectComponentArtifactMetadata + } + .map { it.file } + .toSet() + map } // nested inputs are processed in configuration phase