diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt index 3a0b61664d7..9037842fd79 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt @@ -140,8 +140,8 @@ abstract class AbstractKotlinTargetConfigurator project.locateOrRegisterTask(compilation.processResourcesTaskName) { resourcesTask -> resourcesTask.description = "Processes $resourceSet." - DslObject(resourcesTask).conventionMapping.map("destinationDir") { project.file(compilation.output.resourcesDir) } resourcesTask.from(resourceSet) + resourcesTask.into(project.file(compilation.output.resourcesDir)) } } 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 f0002ce7a03..aaa61a9cbb6 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 @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.targets.js.RequiredKotlinJsDependency import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies +import org.jetbrains.kotlin.gradle.utils.disableTaskOnConfigurationCacheBuild import java.io.File abstract class DukatTask( @@ -21,6 +22,11 @@ abstract class DukatTask( @get:Internal protected val nodeJs = NodeJsRootPlugin.apply(project.rootProject) + init { + // TODO: temporary workaround for configuration cache enabled builds + disableTaskOnConfigurationCacheBuild { nodeJs.npmResolutionManager.toString() } + } + @get:Internal override val nodeModulesRequired: Boolean get() = true 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 0455d1d8361..5c003724c87 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 @@ -21,8 +21,9 @@ constructor( override val considerGeneratingFlag: Boolean = true @get:OutputDirectory - override val destinationDir: File - get() = compilation.npmProject.externalsDir + override val destinationDir: File by lazy { + compilation.npmProject.externalsDir + } @delegate:Transient private val executor by lazy { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootExtension.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootExtension.kt index 8d33340e280..ed95e35e6ff 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootExtension.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootExtension.kt @@ -66,8 +66,9 @@ open class NodeJsRootExtension(@Transient val rootProject: Project) : Configurat val rootPackageJsonTaskProvider: TaskProvider get() = rootProject.tasks.withType(RootPackageJsonTask::class.java).named(RootPackageJsonTask.NAME) - val rootPackageDir: File - get() = rootProject.buildDir.resolve("js") + val rootPackageDir: File by lazy { + rootProject.buildDir.resolve("js") + } internal val rootNodeModulesStateFile: File get() = rootPackageDir.resolve("node_modules.state") diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsSetupTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsSetupTask.kt index d09f089ffa3..f7c2f1e6bbe 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsSetupTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsSetupTask.kt @@ -13,7 +13,7 @@ import java.net.URI @CacheableTask open class NodeJsSetupTask : DefaultTask() { - private val settings get() = NodeJsRootPlugin.apply(project.rootProject) + private val settings = NodeJsRootPlugin.apply(project.rootProject) private val env by lazy { settings.requireConfigured() } val ivyDependency: String diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmDependency.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmDependency.kt index 74f18a98957..7c9c0a15ee8 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmDependency.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmDependency.kt @@ -16,12 +16,12 @@ import org.gradle.api.internal.artifacts.dependencies.SelfResolvingDependencyInt import org.gradle.api.tasks.TaskDependency import org.gradle.internal.component.local.model.DefaultLibraryBinaryIdentifier import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin -import org.jetbrains.kotlin.gradle.targets.js.npm.NpmDependency.Scope.DEV import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject.Companion.PACKAGE_JSON import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution import java.io.File data class NpmDependency( + @Transient internal val project: Project, private val name: String, private val version: String, diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProject.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProject.kt index ee7aedfb814..10739c00fca 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProject.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProject.kt @@ -24,7 +24,7 @@ val KotlinJsCompilation.npmProject: NpmProject * * More info can be obtained from [KotlinCompilationNpmResolution], which is available after project resolution (after [KotlinNpmInstallTask] execution). */ -open class NpmProject(val compilation: KotlinJsCompilation) { +open class NpmProject(@Transient val compilation: KotlinJsCompilation) { val name: String get() = buildNpmProjectName() diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/PublicPackageJsonTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/PublicPackageJsonTask.kt index 52eebcf4119..83a3e636651 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/PublicPackageJsonTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/PublicPackageJsonTask.kt @@ -13,6 +13,7 @@ import org.gradle.api.tasks.TaskAction import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrCompilation import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject.Companion.PACKAGE_JSON +import org.jetbrains.kotlin.gradle.utils.disableTaskOnConfigurationCacheBuild import org.jetbrains.kotlin.gradle.utils.property import java.io.File import javax.inject.Inject @@ -23,13 +24,17 @@ constructor( @Transient private val compilation: KotlinJsCompilation ) : DefaultTask() { - @Transient private val npmProject = compilation.npmProject private val nodeJs = npmProject.nodeJs private val compilationResolution get() = nodeJs.npmResolutionManager.requireInstalled()[project][npmProject.compilation] + init { + // TODO: temporary workaround for configuration cache enabled builds + disableTaskOnConfigurationCacheBuild { nodeJs.npmResolutionManager.toString() } + } + @get:Input val packageJsonCustomFields: Map get() = PackageJson(fakePackageJsonValue, fakePackageJsonValue) @@ -51,11 +56,13 @@ constructor( private val realExternalDependencies: Collection get() = compilationResolution.externalNpmDependencies + private val publicPackageJsonTaskName = npmProject.publicPackageJsonTaskName + @get:OutputFile var packageJsonFile: File by property { project.buildDir .resolve("tmp") - .resolve(npmProject.publicPackageJsonTaskName) + .resolve(publicPackageJsonTaskName) .resolve(PACKAGE_JSON) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinNpmInstallTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinNpmInstallTask.kt index 78b99023fc1..e22c0632703 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinNpmInstallTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinNpmInstallTask.kt @@ -11,6 +11,7 @@ import org.gradle.api.tasks.InputFiles import org.gradle.api.tasks.OutputFile import org.gradle.api.tasks.TaskAction import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin +import org.jetbrains.kotlin.gradle.utils.disableTaskOnConfigurationCacheBuild import java.io.File open class KotlinNpmInstallTask : DefaultTask() { @@ -27,17 +28,24 @@ open class KotlinNpmInstallTask : DefaultTask() { private val nodeJs = NodeJsRootPlugin.apply(project.rootProject) private val resolutionManager get() = nodeJs.npmResolutionManager + init { + // TODO: temporary workaround for configuration cache enabled builds + disableTaskOnConfigurationCacheBuild { resolutionManager.toString() } + } + @Input val args: MutableList = mutableListOf() @Suppress("unused") @get:InputFiles - val packageJsonFiles: Collection - get() = resolutionManager.packageJsonFiles + val packageJsonFiles: Collection by lazy { + resolutionManager.packageJsonFiles + } @get:InputFiles - val preparedFiles: Collection - get() = nodeJs.packageManager.preparedFiles(project) + val preparedFiles: Collection by lazy { + nodeJs.packageManager.preparedFiles(project) + } // avoid using node_modules as output directory, as it is significantly slows down build @get:OutputFile diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinPackageJsonTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinPackageJsonTask.kt index 51d7cb17000..d0fdc08fdc7 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinPackageJsonTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinPackageJsonTask.kt @@ -33,11 +33,12 @@ open class KotlinPackageJsonTask : DefaultTask() { get() = compilationResolver.packageJsonProducer @get:Input - val packageJsonCustomFields: Map - get() = PackageJson(fakePackageJsonValue, fakePackageJsonValue) + val packageJsonCustomFields: Map by lazy { + PackageJson(fakePackageJsonValue, fakePackageJsonValue) .apply { compilation.packageJsonHandlers.forEach { it() } }.customFields + } private fun findDependentTasks(): Collection = producer.internalDependencies.map { dependentResolver -> @@ -47,18 +48,21 @@ open class KotlinPackageJsonTask : DefaultTask() { } @get:Input - internal val toolsNpmDependencies: List - get() = nodeJs.taskRequirements + internal val toolsNpmDependencies: List by lazy { + nodeJs.taskRequirements .getCompilationNpmRequirements(compilation) .map { it.uniqueRepresentation() } + } @get:Nested - internal val producerInputs: KotlinCompilationNpmResolver.PackageJsonProducerInputs - get() = producer.inputs + internal val producerInputs: KotlinCompilationNpmResolver.PackageJsonProducerInputs by lazy { + producer.inputs + } @get:OutputFile - val packageJson: File - get() = compilationResolver.npmProject.prePackageJsonFile + val packageJson: File by lazy { + compilationResolver.npmProject.prePackageJsonFile + } @TaskAction fun resolve() { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/RootPackageJsonTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/RootPackageJsonTask.kt index 0e96c84e38d..d1a15e4f2ca 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/RootPackageJsonTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/RootPackageJsonTask.kt @@ -10,6 +10,7 @@ import org.gradle.api.tasks.OutputFile import org.gradle.api.tasks.TaskAction import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject +import org.jetbrains.kotlin.gradle.utils.disableTaskOnConfigurationCacheBuild import java.io.File open class RootPackageJsonTask : DefaultTask() { @@ -24,6 +25,11 @@ open class RootPackageJsonTask : DefaultTask() { private val nodeJs = NodeJsRootPlugin.apply(project.rootProject) private val resolutionManager get() = nodeJs.npmResolutionManager + init { + // TODO: temporary workaround for configuration cache enabled builds + disableTaskOnConfigurationCacheBuild { resolutionManager.toString() } + } + @get:OutputFile val rootPackageJson: File get() = nodeJs.rootPackageDir.resolve(NpmProject.PACKAGE_JSON) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpack.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpack.kt index ebe3cb0737a..c1873812c58 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpack.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpack.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig.Mode import org.jetbrains.kotlin.gradle.testing.internal.reportsDir +import org.jetbrains.kotlin.gradle.utils.disableTaskOnConfigurationCacheBuild import org.jetbrains.kotlin.gradle.utils.injected import org.jetbrains.kotlin.gradle.utils.newFileProperty import org.jetbrains.kotlin.gradle.utils.property @@ -41,6 +42,11 @@ constructor( private val nodeJs = NodeJsRootPlugin.apply(project.rootProject) private val versions = nodeJs.versions + init { + // TODO: temporary workaround for configuration cache enabled builds + disableTaskOnConfigurationCacheBuild { nodeJs.npmResolutionManager.toString() } + } + @get:Inject open val fileResolver: FileResolver get() = injected @@ -50,11 +56,13 @@ constructor( get() = injected @Suppress("unused") - val compilationId: String - @Input get() = compilation.let { + @get:Input + val compilationId: String by lazy { + compilation.let { val target = it.target target.project.path + "@" + target.name + ":" + it.compilationName } + } @Input var mode: Mode = Mode.DEVELOPMENT @@ -82,11 +90,15 @@ constructor( internal var resolveFromModulesFirst: Boolean = false @Suppress("unused") - val runtimeClasspath: FileCollection - @InputFiles get() = compilation.compileDependencyFiles + @get:InputFiles + val runtimeClasspath: FileCollection by lazy { + compilation.compileDependencyFiles + } - open val configFile: File - @OutputFile get() = compilation.npmProject.dir.resolve("webpack.config.js") + @get:OutputFile + open val configFile: File by lazy { + compilation.npmProject.dir.resolve("webpack.config.js") + } @Input var saveEvaluatedConfigFile: Boolean = true @@ -134,12 +146,12 @@ constructor( open val reportDir: File @Internal get() = reportDirProvider.get() - open val reportDirProvider: Provider - @OutputDirectory get() = entryProperty - .map { it.asFile.nameWithoutExtension } - .map { - project.reportsDir.resolve("webpack").resolve(it) - } + @OutputDirectory + open val reportDirProvider: Provider = entryProperty + .map { it.asFile.nameWithoutExtension } + .map { + project.reportsDir.resolve("webpack").resolve(it) + } open val evaluatedConfigFile: File @Internal get() = evaluatedConfigFileProvider.get() diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/ParsedGradleVersion.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/ParsedGradleVersion.kt index 2312e3d8a7c..2f22e2b6254 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/ParsedGradleVersion.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/ParsedGradleVersion.kt @@ -58,11 +58,3 @@ internal data class ParsedGradleVersion(val major: Int, val minor: Int) : Compar fun isGradleVersionAtLeast(major: Int, minor: Int) = ParsedGradleVersion.parse(GradleVersion.current().version) ?.let { it >= ParsedGradleVersion(major, minor) } ?: false - -fun isConfigurationCacheAvailable(gradle: Gradle) = - try { - val startParameters = gradle.startParameter - startParameters.javaClass.getMethod("isConfigurationCache").invoke(startParameters) as? Boolean - } catch (_: Exception) { - null - } ?: false diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/configurationCache.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/configurationCache.kt new file mode 100644 index 00000000000..1a435028f97 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/configurationCache.kt @@ -0,0 +1,33 @@ +/* + * Copyright 2010-2020 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.utils + +import org.gradle.api.Task +import org.gradle.api.invocation.Gradle + +internal fun isConfigurationCacheAvailable(gradle: Gradle) = + try { + val startParameters = gradle.startParameter + startParameters.javaClass.getMethod("isConfigurationCache").invoke(startParameters) as? Boolean + } catch (_: Exception) { + null + } ?: false + +internal fun Task.disableTaskOnConfigurationCacheBuild(transientFieldAccessor: () -> Unit) { + if (isConfigurationCacheAvailable(project.gradle)) { + onlyIf { + logger.warn("Configuration cache is not yet fully supported: use it at your own risk.") + try { + // transientFieldAccessor() will throw an exception after loading task from configuration cache + transientFieldAccessor() + true + } catch (e: Exception) { + logger.warn("Task cannot be executed because of corrupted state after loading from configuration cache.") + false + } + } + } +} \ No newline at end of file