diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootPlugin.kt index 0b0f846ec4f..a204752f773 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootPlugin.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnPlugin import org.jetbrains.kotlin.gradle.tasks.CleanDataTask import org.jetbrains.kotlin.gradle.tasks.registerTask import org.jetbrains.kotlin.gradle.tasks.withType +import org.jetbrains.kotlin.gradle.utils.* import org.jetbrains.kotlin.gradle.utils.SingleActionPerProject import org.jetbrains.kotlin.gradle.utils.castIsolatedKotlinPluginClassLoaderAware import org.jetbrains.kotlin.gradle.utils.doNotTrackStateCompat @@ -80,7 +81,7 @@ open class NodeJsRootPlugin : Plugin { it.group = TASKS_GROUP_NAME it.description = "Find, download and link NPM dependencies and projects" - it.onlyIf { task -> + it.onlyIfCompat("No package.json files for install") { task -> task as KotlinNpmInstallTask task.preparedFiles.all { file -> file.exists() diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnPlugin.kt index 162bce153f4..5229b8d7e66 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnPlugin.kt @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnLockCopyTask.Companion.ST import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnLockCopyTask.Companion.UPGRADE_YARN_LOCK import org.jetbrains.kotlin.gradle.tasks.CleanDataTask import org.jetbrains.kotlin.gradle.tasks.registerTask +import org.jetbrains.kotlin.gradle.utils.onlyIfCompat open class YarnPlugin : Plugin { override fun apply(project: Project): Unit = project.run { @@ -58,7 +59,7 @@ open class YarnPlugin : Plugin { task.npmResolutionManager.value(kotlinNpmResolutionManager) .disallowChanges() - task.onlyIf { + task.onlyIfCompat("Prepare NPM project only in configuring state") { it as RootPackageJsonTask it.npmResolutionManager.get().isConfiguringState() } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/compatibility.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/compatibility.kt index b4641335b74..256a723bb7e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/compatibility.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/compatibility.kt @@ -28,6 +28,7 @@ import org.gradle.api.file.FileTree import org.gradle.api.internal.project.ProjectInternal import org.gradle.api.internal.tasks.testing.TestDescriptorInternal import org.gradle.api.provider.Provider +import org.gradle.api.specs.Spec import org.gradle.api.tasks.WorkResult import org.gradle.api.tasks.bundling.AbstractArchiveTask import org.gradle.api.tasks.testing.TestDescriptor @@ -78,6 +79,18 @@ internal fun Task.doNotTrackStateCompat(because: String) { } } +/** + * According to [Gradle 7.6 release notes](https://docs.gradle.org/7.6/release-notes.html#introduced-ability-to-explain-why-a-task-was-skipped-with-a-message) + * [Task.onlyIf] has reason message` + */ +internal fun Task.onlyIfCompat(onlyIfReason: String, onlyIfSpec: Spec) { + if (GradleVersion.current() < GradleVersion.version("7.6")) { + onlyIf(onlyIfSpec) + } else { + onlyIf(onlyIfReason, onlyIfSpec) + } +} + /** * [ArtifactCollection.getResolvedArtifacts] is available after 7.4 (inclusive) */