From c73dadbcdf356bdec9884b30600ffdeab2e7210c Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Fri, 16 Apr 2021 16:58:06 +0300 Subject: [PATCH] [Gradle, JS] Install dukat only if there is dependency with generateExternals ^KT-46178 fixed --- .../kotlin/gradle/DukatIntegrationIT.kt | 30 +++++++++++++++++++ .../build.gradle.kts | 21 +++++++++++++ .../settings.gradle.kts | 6 ++++ .../gradle/targets/js/dukat/DukatTask.kt | 2 +- .../targets/js/dukat/IntegratedDukatTask.kt | 5 ++++ .../targets/js/dukat/SeparateDukatTask.kt | 5 ++++ .../resolver/KotlinCompilationNpmResolver.kt | 17 ++++++++++- 7 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/dukat-integration/without-generate-externals/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/dukat-integration/without-generate-externals/settings.gradle.kts diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/DukatIntegrationIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/DukatIntegrationIT.kt index 5e2e9fbdca2..87a99d1607f 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/DukatIntegrationIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/DukatIntegrationIT.kt @@ -5,10 +5,14 @@ package org.jetbrains.kotlin.gradle +import com.google.gson.Gson import org.gradle.api.logging.configuration.WarningMode import org.jetbrains.kotlin.gradle.targets.js.dukat.ExternalsOutputFormat +import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject +import org.jetbrains.kotlin.gradle.targets.js.npm.PackageJson import org.jetbrains.kotlin.gradle.util.modify import org.junit.Test +import kotlin.test.assertFalse import kotlin.test.assertTrue class DukatIntegrationIT : BaseGradleIT() { @@ -397,6 +401,32 @@ class DukatIntegrationIT : BaseGradleIT() { } } + @Test + fun testWithoutGenerateExternals() { + val projectName = "without-generate-externals" + val project = Project( + projectName = projectName, + directoryPrefix = "dukat-integration" + ) + project.setupWorkingDir() + + project.gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl) + + project.build("assemble", options = defaultBuildOptions().copy(warningMode = WarningMode.Summary)) { + assertSuccessful() + + assertTasksNotExecuted(":generateExternalsIntegrated") + + assertFalse("Dukat don't need to be dependency for thus project") { + fileInWorkingDir("build/js/packages/without-generate-externals") + .resolve(NpmProject.PACKAGE_JSON) + .let { + Gson().fromJson(it.readText(), PackageJson::class.java) + }.dependencies.containsKey("dukat") + } + } + } + private fun projectName( dslType: DslType, dependenciesLocation: DependenciesLocation diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/dukat-integration/without-generate-externals/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/dukat-integration/without-generate-externals/build.gradle.kts new file mode 100644 index 00000000000..e67fb49868e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/dukat-integration/without-generate-externals/build.gradle.kts @@ -0,0 +1,21 @@ +plugins { + kotlin("js") version "" +} + +repositories { + mavenLocal() + mavenCentral() +} + +dependencies { + implementation(kotlin("stdlib-js")) + implementation(npm("left-pad", "1.3.0")) + implementation(npm("decamelize", "4.0.0")) +} + +kotlin { + js { + useCommonJs() + nodejs() + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/dukat-integration/without-generate-externals/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/dukat-integration/without-generate-externals/settings.gradle.kts new file mode 100644 index 00000000000..3b582363c98 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/dukat-integration/without-generate-externals/settings.gradle.kts @@ -0,0 +1,6 @@ +pluginManagement { + repositories { + mavenLocal() + gradlePluginPortal() + } +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatTask.kt index 3c31161084a..fba806a8e6a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatTask.kt @@ -38,7 +38,7 @@ abstract class DukatTask( @get:Internal override val requiredNpmDependencies: Set by lazy { - setOf(nodeJs.versions.dukat) + emptySet() } /** diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/IntegratedDukatTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/IntegratedDukatTask.kt index e82c4077a1e..76f30329128 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/IntegratedDukatTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/IntegratedDukatTask.kt @@ -17,6 +17,11 @@ open class IntegratedDukatTask constructor( compilation: KotlinJsCompilation ) : DukatTask(compilation) { + init { + onlyIf { + dts.isNotEmpty() || npmProject.externalsDirRoot.resolve("inputs.txt").exists() + } + } override val considerGeneratingFlag: Boolean = true diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/SeparateDukatTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/SeparateDukatTask.kt index b22e114fcd8..d79efd7813f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/SeparateDukatTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/SeparateDukatTask.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.gradle.targets.js.dukat import org.gradle.api.tasks.OutputDirectory import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation +import org.jetbrains.kotlin.gradle.targets.js.RequiredKotlinJsDependency import org.jetbrains.kotlin.gradle.utils.property import java.io.File import javax.inject.Inject @@ -18,6 +19,10 @@ constructor( ) : DukatTask(compilation) { override val considerGeneratingFlag: Boolean = false + override val requiredNpmDependencies: Set by lazy { + setOf(nodeJs.versions.dukat) + } + @get:OutputDirectory override var destinationDir: File by property { project.projectDir.resolve("externals") diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt index 6ca57697765..81439e9e428 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt @@ -405,6 +405,10 @@ internal class KotlinCompilationNpmResolver( private val projectPackagesDir by lazy { compilationResolver.nodeJs.projectPackagesDir } private val rootDir by lazy { compilationResolver.nodeJs.rootProject.rootDir } + private val dukatPackageVersion by lazy { + compilationResolver.nodeJs.versions.dukat + } + @Transient internal lateinit var compilationResolver: KotlinCompilationNpmResolver @@ -452,7 +456,18 @@ internal class KotlinCompilationNpmResolver( val toolsNpmDependencies = compilationResolver.rootResolver.nodeJs.taskRequirements .getCompilationNpmRequirements(compilationResolver.compilationDisambiguatedName) - val allNpmDependencies = externalNpmDependencies + toolsNpmDependencies + val dukatIfNecessary = if (externalNpmDependencies.any { it.generateExternals }) { + setOf( + NpmDependencyDeclaration( + scope = NpmDependency.Scope.DEV, + name = dukatPackageVersion.name, + version = dukatPackageVersion.version, + generateExternals = false + ) + ) + } else emptySet() + + val allNpmDependencies = externalNpmDependencies + toolsNpmDependencies + dukatIfNecessary val packageJson = packageJson( compilationResolver.npmProject.name,