[Gradle, JS] Fix K/JS project build with configuration cache (part 3)
Now configuration cache enabled builds with JS tasks does not fails but prints warning and skips execution on subsequent builds. Relates to KT-42494
This commit is contained in:
+1
-1
@@ -140,8 +140,8 @@ abstract class AbstractKotlinTargetConfigurator<KotlinTargetType : KotlinTarget>
|
|||||||
|
|
||||||
project.locateOrRegisterTask<ProcessResources>(compilation.processResourcesTaskName) { resourcesTask ->
|
project.locateOrRegisterTask<ProcessResources>(compilation.processResourcesTaskName) { resourcesTask ->
|
||||||
resourcesTask.description = "Processes $resourceSet."
|
resourcesTask.description = "Processes $resourceSet."
|
||||||
DslObject(resourcesTask).conventionMapping.map("destinationDir") { project.file(compilation.output.resourcesDir) }
|
|
||||||
resourcesTask.from(resourceSet)
|
resourcesTask.from(resourceSet)
|
||||||
|
resourcesTask.into(project.file(compilation.output.resourcesDir))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+6
@@ -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.RequiredKotlinJsDependency
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
|
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies
|
import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.disableTaskOnConfigurationCacheBuild
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
abstract class DukatTask(
|
abstract class DukatTask(
|
||||||
@@ -21,6 +22,11 @@ abstract class DukatTask(
|
|||||||
@get:Internal
|
@get:Internal
|
||||||
protected val nodeJs = NodeJsRootPlugin.apply(project.rootProject)
|
protected val nodeJs = NodeJsRootPlugin.apply(project.rootProject)
|
||||||
|
|
||||||
|
init {
|
||||||
|
// TODO: temporary workaround for configuration cache enabled builds
|
||||||
|
disableTaskOnConfigurationCacheBuild { nodeJs.npmResolutionManager.toString() }
|
||||||
|
}
|
||||||
|
|
||||||
@get:Internal
|
@get:Internal
|
||||||
override val nodeModulesRequired: Boolean
|
override val nodeModulesRequired: Boolean
|
||||||
get() = true
|
get() = true
|
||||||
|
|||||||
+3
-2
@@ -21,8 +21,9 @@ constructor(
|
|||||||
override val considerGeneratingFlag: Boolean = true
|
override val considerGeneratingFlag: Boolean = true
|
||||||
|
|
||||||
@get:OutputDirectory
|
@get:OutputDirectory
|
||||||
override val destinationDir: File
|
override val destinationDir: File by lazy {
|
||||||
get() = compilation.npmProject.externalsDir
|
compilation.npmProject.externalsDir
|
||||||
|
}
|
||||||
|
|
||||||
@delegate:Transient
|
@delegate:Transient
|
||||||
private val executor by lazy {
|
private val executor by lazy {
|
||||||
|
|||||||
+3
-2
@@ -66,8 +66,9 @@ open class NodeJsRootExtension(@Transient val rootProject: Project) : Configurat
|
|||||||
val rootPackageJsonTaskProvider: TaskProvider<RootPackageJsonTask>
|
val rootPackageJsonTaskProvider: TaskProvider<RootPackageJsonTask>
|
||||||
get() = rootProject.tasks.withType(RootPackageJsonTask::class.java).named(RootPackageJsonTask.NAME)
|
get() = rootProject.tasks.withType(RootPackageJsonTask::class.java).named(RootPackageJsonTask.NAME)
|
||||||
|
|
||||||
val rootPackageDir: File
|
val rootPackageDir: File by lazy {
|
||||||
get() = rootProject.buildDir.resolve("js")
|
rootProject.buildDir.resolve("js")
|
||||||
|
}
|
||||||
|
|
||||||
internal val rootNodeModulesStateFile: File
|
internal val rootNodeModulesStateFile: File
|
||||||
get() = rootPackageDir.resolve("node_modules.state")
|
get() = rootPackageDir.resolve("node_modules.state")
|
||||||
|
|||||||
+1
-1
@@ -13,7 +13,7 @@ import java.net.URI
|
|||||||
|
|
||||||
@CacheableTask
|
@CacheableTask
|
||||||
open class NodeJsSetupTask : DefaultTask() {
|
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() }
|
private val env by lazy { settings.requireConfigured() }
|
||||||
|
|
||||||
val ivyDependency: String
|
val ivyDependency: String
|
||||||
|
|||||||
+1
-1
@@ -16,12 +16,12 @@ import org.gradle.api.internal.artifacts.dependencies.SelfResolvingDependencyInt
|
|||||||
import org.gradle.api.tasks.TaskDependency
|
import org.gradle.api.tasks.TaskDependency
|
||||||
import org.gradle.internal.component.local.model.DefaultLibraryBinaryIdentifier
|
import org.gradle.internal.component.local.model.DefaultLibraryBinaryIdentifier
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
|
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.NpmProject.Companion.PACKAGE_JSON
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution
|
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
data class NpmDependency(
|
data class NpmDependency(
|
||||||
|
@Transient
|
||||||
internal val project: Project,
|
internal val project: Project,
|
||||||
private val name: String,
|
private val name: String,
|
||||||
private val version: String,
|
private val version: String,
|
||||||
|
|||||||
+1
-1
@@ -24,7 +24,7 @@ val KotlinJsCompilation.npmProject: NpmProject
|
|||||||
*
|
*
|
||||||
* More info can be obtained from [KotlinCompilationNpmResolution], which is available after project resolution (after [KotlinNpmInstallTask] execution).
|
* 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
|
val name: String
|
||||||
get() = buildNpmProjectName()
|
get() = buildNpmProjectName()
|
||||||
|
|
||||||
|
|||||||
+9
-2
@@ -13,6 +13,7 @@ import org.gradle.api.tasks.TaskAction
|
|||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
|
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrCompilation
|
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.targets.js.npm.NpmProject.Companion.PACKAGE_JSON
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.disableTaskOnConfigurationCacheBuild
|
||||||
import org.jetbrains.kotlin.gradle.utils.property
|
import org.jetbrains.kotlin.gradle.utils.property
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
@@ -23,13 +24,17 @@ constructor(
|
|||||||
@Transient
|
@Transient
|
||||||
private val compilation: KotlinJsCompilation
|
private val compilation: KotlinJsCompilation
|
||||||
) : DefaultTask() {
|
) : DefaultTask() {
|
||||||
@Transient
|
|
||||||
private val npmProject = compilation.npmProject
|
private val npmProject = compilation.npmProject
|
||||||
private val nodeJs = npmProject.nodeJs
|
private val nodeJs = npmProject.nodeJs
|
||||||
|
|
||||||
private val compilationResolution
|
private val compilationResolution
|
||||||
get() = nodeJs.npmResolutionManager.requireInstalled()[project][npmProject.compilation]
|
get() = nodeJs.npmResolutionManager.requireInstalled()[project][npmProject.compilation]
|
||||||
|
|
||||||
|
init {
|
||||||
|
// TODO: temporary workaround for configuration cache enabled builds
|
||||||
|
disableTaskOnConfigurationCacheBuild { nodeJs.npmResolutionManager.toString() }
|
||||||
|
}
|
||||||
|
|
||||||
@get:Input
|
@get:Input
|
||||||
val packageJsonCustomFields: Map<String, Any?>
|
val packageJsonCustomFields: Map<String, Any?>
|
||||||
get() = PackageJson(fakePackageJsonValue, fakePackageJsonValue)
|
get() = PackageJson(fakePackageJsonValue, fakePackageJsonValue)
|
||||||
@@ -51,11 +56,13 @@ constructor(
|
|||||||
private val realExternalDependencies: Collection<NpmDependency>
|
private val realExternalDependencies: Collection<NpmDependency>
|
||||||
get() = compilationResolution.externalNpmDependencies
|
get() = compilationResolution.externalNpmDependencies
|
||||||
|
|
||||||
|
private val publicPackageJsonTaskName = npmProject.publicPackageJsonTaskName
|
||||||
|
|
||||||
@get:OutputFile
|
@get:OutputFile
|
||||||
var packageJsonFile: File by property {
|
var packageJsonFile: File by property {
|
||||||
project.buildDir
|
project.buildDir
|
||||||
.resolve("tmp")
|
.resolve("tmp")
|
||||||
.resolve(npmProject.publicPackageJsonTaskName)
|
.resolve(publicPackageJsonTaskName)
|
||||||
.resolve(PACKAGE_JSON)
|
.resolve(PACKAGE_JSON)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+12
-4
@@ -11,6 +11,7 @@ import org.gradle.api.tasks.InputFiles
|
|||||||
import org.gradle.api.tasks.OutputFile
|
import org.gradle.api.tasks.OutputFile
|
||||||
import org.gradle.api.tasks.TaskAction
|
import org.gradle.api.tasks.TaskAction
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
|
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.disableTaskOnConfigurationCacheBuild
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
open class KotlinNpmInstallTask : DefaultTask() {
|
open class KotlinNpmInstallTask : DefaultTask() {
|
||||||
@@ -27,17 +28,24 @@ open class KotlinNpmInstallTask : DefaultTask() {
|
|||||||
private val nodeJs = NodeJsRootPlugin.apply(project.rootProject)
|
private val nodeJs = NodeJsRootPlugin.apply(project.rootProject)
|
||||||
private val resolutionManager get() = nodeJs.npmResolutionManager
|
private val resolutionManager get() = nodeJs.npmResolutionManager
|
||||||
|
|
||||||
|
init {
|
||||||
|
// TODO: temporary workaround for configuration cache enabled builds
|
||||||
|
disableTaskOnConfigurationCacheBuild { resolutionManager.toString() }
|
||||||
|
}
|
||||||
|
|
||||||
@Input
|
@Input
|
||||||
val args: MutableList<String> = mutableListOf()
|
val args: MutableList<String> = mutableListOf()
|
||||||
|
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
@get:InputFiles
|
@get:InputFiles
|
||||||
val packageJsonFiles: Collection<File>
|
val packageJsonFiles: Collection<File> by lazy {
|
||||||
get() = resolutionManager.packageJsonFiles
|
resolutionManager.packageJsonFiles
|
||||||
|
}
|
||||||
|
|
||||||
@get:InputFiles
|
@get:InputFiles
|
||||||
val preparedFiles: Collection<File>
|
val preparedFiles: Collection<File> by lazy {
|
||||||
get() = nodeJs.packageManager.preparedFiles(project)
|
nodeJs.packageManager.preparedFiles(project)
|
||||||
|
}
|
||||||
|
|
||||||
// avoid using node_modules as output directory, as it is significantly slows down build
|
// avoid using node_modules as output directory, as it is significantly slows down build
|
||||||
@get:OutputFile
|
@get:OutputFile
|
||||||
|
|||||||
+12
-8
@@ -33,11 +33,12 @@ open class KotlinPackageJsonTask : DefaultTask() {
|
|||||||
get() = compilationResolver.packageJsonProducer
|
get() = compilationResolver.packageJsonProducer
|
||||||
|
|
||||||
@get:Input
|
@get:Input
|
||||||
val packageJsonCustomFields: Map<String, Any?>
|
val packageJsonCustomFields: Map<String, Any?> by lazy {
|
||||||
get() = PackageJson(fakePackageJsonValue, fakePackageJsonValue)
|
PackageJson(fakePackageJsonValue, fakePackageJsonValue)
|
||||||
.apply {
|
.apply {
|
||||||
compilation.packageJsonHandlers.forEach { it() }
|
compilation.packageJsonHandlers.forEach { it() }
|
||||||
}.customFields
|
}.customFields
|
||||||
|
}
|
||||||
|
|
||||||
private fun findDependentTasks(): Collection<Any> =
|
private fun findDependentTasks(): Collection<Any> =
|
||||||
producer.internalDependencies.map { dependentResolver ->
|
producer.internalDependencies.map { dependentResolver ->
|
||||||
@@ -47,18 +48,21 @@ open class KotlinPackageJsonTask : DefaultTask() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@get:Input
|
@get:Input
|
||||||
internal val toolsNpmDependencies: List<String>
|
internal val toolsNpmDependencies: List<String> by lazy {
|
||||||
get() = nodeJs.taskRequirements
|
nodeJs.taskRequirements
|
||||||
.getCompilationNpmRequirements(compilation)
|
.getCompilationNpmRequirements(compilation)
|
||||||
.map { it.uniqueRepresentation() }
|
.map { it.uniqueRepresentation() }
|
||||||
|
}
|
||||||
|
|
||||||
@get:Nested
|
@get:Nested
|
||||||
internal val producerInputs: KotlinCompilationNpmResolver.PackageJsonProducerInputs
|
internal val producerInputs: KotlinCompilationNpmResolver.PackageJsonProducerInputs by lazy {
|
||||||
get() = producer.inputs
|
producer.inputs
|
||||||
|
}
|
||||||
|
|
||||||
@get:OutputFile
|
@get:OutputFile
|
||||||
val packageJson: File
|
val packageJson: File by lazy {
|
||||||
get() = compilationResolver.npmProject.prePackageJsonFile
|
compilationResolver.npmProject.prePackageJsonFile
|
||||||
|
}
|
||||||
|
|
||||||
@TaskAction
|
@TaskAction
|
||||||
fun resolve() {
|
fun resolve() {
|
||||||
|
|||||||
+6
@@ -10,6 +10,7 @@ import org.gradle.api.tasks.OutputFile
|
|||||||
import org.gradle.api.tasks.TaskAction
|
import org.gradle.api.tasks.TaskAction
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
|
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject
|
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.disableTaskOnConfigurationCacheBuild
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
open class RootPackageJsonTask : DefaultTask() {
|
open class RootPackageJsonTask : DefaultTask() {
|
||||||
@@ -24,6 +25,11 @@ open class RootPackageJsonTask : DefaultTask() {
|
|||||||
private val nodeJs = NodeJsRootPlugin.apply(project.rootProject)
|
private val nodeJs = NodeJsRootPlugin.apply(project.rootProject)
|
||||||
private val resolutionManager get() = nodeJs.npmResolutionManager
|
private val resolutionManager get() = nodeJs.npmResolutionManager
|
||||||
|
|
||||||
|
init {
|
||||||
|
// TODO: temporary workaround for configuration cache enabled builds
|
||||||
|
disableTaskOnConfigurationCacheBuild { resolutionManager.toString() }
|
||||||
|
}
|
||||||
|
|
||||||
@get:OutputFile
|
@get:OutputFile
|
||||||
val rootPackageJson: File
|
val rootPackageJson: File
|
||||||
get() = nodeJs.rootPackageDir.resolve(NpmProject.PACKAGE_JSON)
|
get() = nodeJs.rootPackageDir.resolve(NpmProject.PACKAGE_JSON)
|
||||||
|
|||||||
+24
-12
@@ -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.npm.npmProject
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig.Mode
|
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig.Mode
|
||||||
import org.jetbrains.kotlin.gradle.testing.internal.reportsDir
|
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.injected
|
||||||
import org.jetbrains.kotlin.gradle.utils.newFileProperty
|
import org.jetbrains.kotlin.gradle.utils.newFileProperty
|
||||||
import org.jetbrains.kotlin.gradle.utils.property
|
import org.jetbrains.kotlin.gradle.utils.property
|
||||||
@@ -41,6 +42,11 @@ constructor(
|
|||||||
private val nodeJs = NodeJsRootPlugin.apply(project.rootProject)
|
private val nodeJs = NodeJsRootPlugin.apply(project.rootProject)
|
||||||
private val versions = nodeJs.versions
|
private val versions = nodeJs.versions
|
||||||
|
|
||||||
|
init {
|
||||||
|
// TODO: temporary workaround for configuration cache enabled builds
|
||||||
|
disableTaskOnConfigurationCacheBuild { nodeJs.npmResolutionManager.toString() }
|
||||||
|
}
|
||||||
|
|
||||||
@get:Inject
|
@get:Inject
|
||||||
open val fileResolver: FileResolver
|
open val fileResolver: FileResolver
|
||||||
get() = injected
|
get() = injected
|
||||||
@@ -50,11 +56,13 @@ constructor(
|
|||||||
get() = injected
|
get() = injected
|
||||||
|
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
val compilationId: String
|
@get:Input
|
||||||
@Input get() = compilation.let {
|
val compilationId: String by lazy {
|
||||||
|
compilation.let {
|
||||||
val target = it.target
|
val target = it.target
|
||||||
target.project.path + "@" + target.name + ":" + it.compilationName
|
target.project.path + "@" + target.name + ":" + it.compilationName
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Input
|
@Input
|
||||||
var mode: Mode = Mode.DEVELOPMENT
|
var mode: Mode = Mode.DEVELOPMENT
|
||||||
@@ -82,11 +90,15 @@ constructor(
|
|||||||
internal var resolveFromModulesFirst: Boolean = false
|
internal var resolveFromModulesFirst: Boolean = false
|
||||||
|
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
val runtimeClasspath: FileCollection
|
@get:InputFiles
|
||||||
@InputFiles get() = compilation.compileDependencyFiles
|
val runtimeClasspath: FileCollection by lazy {
|
||||||
|
compilation.compileDependencyFiles
|
||||||
|
}
|
||||||
|
|
||||||
open val configFile: File
|
@get:OutputFile
|
||||||
@OutputFile get() = compilation.npmProject.dir.resolve("webpack.config.js")
|
open val configFile: File by lazy {
|
||||||
|
compilation.npmProject.dir.resolve("webpack.config.js")
|
||||||
|
}
|
||||||
|
|
||||||
@Input
|
@Input
|
||||||
var saveEvaluatedConfigFile: Boolean = true
|
var saveEvaluatedConfigFile: Boolean = true
|
||||||
@@ -134,12 +146,12 @@ constructor(
|
|||||||
open val reportDir: File
|
open val reportDir: File
|
||||||
@Internal get() = reportDirProvider.get()
|
@Internal get() = reportDirProvider.get()
|
||||||
|
|
||||||
open val reportDirProvider: Provider<File>
|
@OutputDirectory
|
||||||
@OutputDirectory get() = entryProperty
|
open val reportDirProvider: Provider<File> = entryProperty
|
||||||
.map { it.asFile.nameWithoutExtension }
|
.map { it.asFile.nameWithoutExtension }
|
||||||
.map {
|
.map {
|
||||||
project.reportsDir.resolve("webpack").resolve(it)
|
project.reportsDir.resolve("webpack").resolve(it)
|
||||||
}
|
}
|
||||||
|
|
||||||
open val evaluatedConfigFile: File
|
open val evaluatedConfigFile: File
|
||||||
@Internal get() = evaluatedConfigFileProvider.get()
|
@Internal get() = evaluatedConfigFileProvider.get()
|
||||||
|
|||||||
-8
@@ -58,11 +58,3 @@ internal data class ParsedGradleVersion(val major: Int, val minor: Int) : Compar
|
|||||||
fun isGradleVersionAtLeast(major: Int, minor: Int) =
|
fun isGradleVersionAtLeast(major: Int, minor: Int) =
|
||||||
ParsedGradleVersion.parse(GradleVersion.current().version)
|
ParsedGradleVersion.parse(GradleVersion.current().version)
|
||||||
?.let { it >= ParsedGradleVersion(major, minor) } ?: false
|
?.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
|
|
||||||
|
|||||||
+33
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user