Fixes for task configuration avoidance in Gradle Kotlin/JS support

This commit is contained in:
Sergey Igushkin
2020-06-05 19:46:37 +03:00
parent 0b7d8c51cb
commit 10cae9bc5d
14 changed files with 34 additions and 37 deletions
@@ -93,7 +93,7 @@ open class KotlinJsTargetConfigurator(kotlinPluginVersion: String) :
super.configureCompilations(target)
target.compilations.all {
it.compileKotlinTask.kotlinOptions {
it.kotlinOptions {
moduleKind = "umd"
sourceMap = true
sourceMapEmbedSources = null
@@ -43,7 +43,7 @@ internal class DukatCompilationResolverPlugin(
) {
it.group = DUKAT_TASK_GROUP
it.description = "Generate Kotlin/JS external declarations for .d.ts files of all NPM dependencies in ${compilation}"
it.dependsOn(nodeJs.npmInstallTask, npmProject.packageJsonTask)
it.dependsOn(nodeJs.npmInstallTaskProvider, npmProject.packageJsonTask)
}
}
@@ -178,7 +178,7 @@ open class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) :
val type = binary.mode
dependsOn(
nodeJs.npmInstallTask,
nodeJs.npmInstallTaskProvider,
target.project.tasks.named(compilation.processResourcesTaskName)
)
@@ -113,7 +113,7 @@ abstract class KotlinJsIrSubTarget(
testExecutableTask.flatMap { it.outputFileProperty }
)
testJs.dependsOn(nodeJs.npmInstallTask, nodeJs.nodeJsSetupTask)
testJs.dependsOn(nodeJs.npmInstallTaskProvider, nodeJs.nodeJsSetupTaskProvider)
testJs.onlyIf { task ->
(task as KotlinJsTest).inputFileProperty
@@ -86,10 +86,9 @@ constructor(
) {
it.nodeJs = nodeJs
it.executable = nodeJs.requireConfigured().nodeExecutable
it.dependsOn(nodeJs.npmInstallTask)
it.dependsOn(nodeJs.npmInstallTaskProvider)
val compileKotlinTask = compilation.compileKotlinTask
it.dependsOn(nodeJs.npmInstallTask, compileKotlinTask)
it.dependsOn(nodeJs.npmInstallTaskProvider, compilation.compileKotlinTaskProvider)
it.configuration()
}
@@ -52,17 +52,17 @@ open class NodeJsRootExtension(val rootProject: Project) : ConfigurationPhaseAwa
val taskRequirements = TasksRequirements()
val nodeJsSetupTask: NodeJsSetupTask
get() = rootProject.tasks.getByName(NodeJsSetupTask.NAME) as NodeJsSetupTask
val nodeJsSetupTaskProvider: TaskProvider<out NodeJsSetupTask>
get() = rootProject.tasks.withType(NodeJsSetupTask::class.java).named(NodeJsSetupTask.NAME)
val npmInstallTask: KotlinNpmInstallTask
get() = rootProject.tasks.getByName(KotlinNpmInstallTask.NAME) as KotlinNpmInstallTask
val npmInstallTaskProvider: TaskProvider<out KotlinNpmInstallTask>
get() = rootProject.tasks.withType(KotlinNpmInstallTask::class.java).named(KotlinNpmInstallTask.NAME)
val packageJsonUmbrellaTaskProvider: TaskProvider<Task>
get() = rootProject.tasks.named(PACKAGE_JSON_UMBRELLA_TASK_NAME)
val rootPackageJsonTask: RootPackageJsonTask
get() = rootProject.tasks.getByName(RootPackageJsonTask.NAME) as RootPackageJsonTask
val rootPackageJsonTaskProvider: TaskProvider<RootPackageJsonTask>
get() = rootProject.tasks.withType(RootPackageJsonTask::class.java).named(RootPackageJsonTask.NAME)
val rootPackageDir: File
get() = rootProject.buildDir.resolve("js")
@@ -111,7 +111,7 @@ open class NodeJsRootExtension(val rootProject: Project) : ConfigurationPhaseAwa
val nodeJsEnv = requireConfigured()
if (download) {
if (!nodeJsEnv.nodeBinDir.isDirectory) {
nodeJsSetupTask.exec()
nodeJsSetupTaskProvider.get().exec()
}
}
}
@@ -132,7 +132,7 @@ class KotlinNpmResolutionManager(private val nodeJsSettings: NodeJsRootExtension
return (state as ResolutionState.Installed).resolved
}
val installUpToDate = nodeJsSettings.npmInstallTask.state.upToDate
val installUpToDate = nodeJsSettings.npmInstallTaskProvider.get().state.upToDate
val forceUpToDate = installUpToDate && !forceFullResolve
val installation = prepareIfNeeded(requireUpToDateReason = reason)
@@ -175,7 +175,7 @@ class KotlinNpmResolutionManager(private val nodeJsSettings: NodeJsRootExtension
when (state1) {
is ResolutionState.Prepared -> alreadyResolved(state1.preparedInstallation)
is ResolutionState.Configuring -> {
val upToDate = nodeJsSettings.rootPackageJsonTask.state.upToDate
val upToDate = nodeJsSettings.rootPackageJsonTaskProvider.get().state.upToDate
if (requireUpToDateReason != null && !upToDate) {
error("NPM dependencies should be resolved $requireUpToDateReason")
}
@@ -57,7 +57,7 @@ internal class KotlinCompilationNpmResolver(
listOf(nodeJs, npmProject)
) {
it.skipOnEmptyNpmDependencies = true
it.dependsOn(nodeJs.npmInstallTask)
it.dependsOn(nodeJs.npmInstallTaskProvider)
it.dependsOn(packageJsonTaskHolder)
}.also { packageJsonTask ->
if (compilation.isMain()) {
@@ -59,7 +59,7 @@ internal class KotlinProjectNpmResolver(
nodeJs.taskRequirements.addTaskRequirements(task)
}
task.dependsOn(packageJsonTaskHolder)
task.dependsOn(nodeJs.npmInstallTask)
task.dependsOn(nodeJs.npmInstallTaskProvider)
}
}
}
@@ -14,6 +14,7 @@ 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.resolver.KotlinCompilationNpmResolver
import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.PACKAGE_JSON_UMBRELLA_TASK_NAME
import org.jetbrains.kotlin.gradle.tasks.dependsOn
import org.jetbrains.kotlin.gradle.tasks.registerTask
import java.io.File
@@ -61,7 +62,7 @@ open class KotlinPackageJsonTask : DefaultTask() {
val nodeJs = NodeJsRootPlugin.apply(project.rootProject)
val rootClean = project.rootProject.tasks.named(BasePlugin.CLEAN_TASK_NAME)
val npmInstallTask = nodeJs.npmInstallTask
val npmInstallTask = nodeJs.npmInstallTaskProvider
val packageJsonTaskName = npmProject.packageJsonTaskName
val packageJsonUmbrella = nodeJs.packageJsonUmbrellaTaskProvider
val packageJsonTask = project.registerTask<KotlinPackageJsonTask>(packageJsonTaskName) { task ->
@@ -77,12 +78,10 @@ open class KotlinPackageJsonTask : DefaultTask() {
task.inputs.file(packageJsonTask.map { it.packageJson })
}
nodeJs.rootPackageJsonTask.mustRunAfter(packageJsonTask)
nodeJs.rootPackageJsonTaskProvider.configure { it.mustRunAfter(packageJsonTask) }
compilation.compileKotlinTask.dependsOn(
npmInstallTask,
packageJsonTask
)
compilation.compileKotlinTaskProvider.dependsOn(npmInstallTask)
compilation.compileKotlinTaskProvider.dependsOn(packageJsonTask)
return packageJsonTask
}
@@ -216,7 +216,7 @@ open class KotlinBrowserJs @Inject constructor(target: KotlinJsTarget) :
nodeJs: NodeJsRootExtension
) {
dependsOn(
nodeJs.npmInstallTask,
nodeJs.npmInstallTaskProvider,
target.project.tasks.named(compilation.processResourcesTaskName)
)
@@ -27,7 +27,6 @@ import org.jetbrains.kotlin.gradle.tasks.registerTask
import org.jetbrains.kotlin.gradle.testing.internal.configureConventions
import org.jetbrains.kotlin.gradle.testing.internal.kotlinTestRegistry
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import org.jetbrains.kotlin.gradle.utils.newFileProperty
abstract class KotlinJsSubTarget(
val target: KotlinJsTarget,
@@ -59,7 +58,9 @@ abstract class KotlinJsSubTarget(
target.compilations.all {
val npmProject = it.npmProject
it.compileKotlinTask.kotlinOptions.outputFile = npmProject.dir.resolve(npmProject.main).canonicalPath
it.kotlinOptions {
outputFile = npmProject.dir.resolve(npmProject.main).canonicalPath
}
}
}
@@ -97,19 +98,18 @@ abstract class KotlinJsSubTarget(
testRun.subtargetTestTaskName(),
listOf(compilation)
) { testJs ->
val compileTask = compilation.compileKotlinTask
val compileTask = compilation.compileKotlinTaskProvider
testJs.group = LifecycleBasePlugin.VERIFICATION_GROUP
testJs.description = testTaskDescription
testJs.inputFileProperty.set(project.newFileProperty {
compileTask.outputFile
})
val compileOutputFile = compileTask.map { it.outputFile }
testJs.inputFileProperty.set(project.layout.file(compileOutputFile))
testJs.dependsOn(nodeJs.npmInstallTask, compileTask, nodeJs.nodeJsSetupTask)
testJs.dependsOn(nodeJs.npmInstallTaskProvider, compileTask, nodeJs.nodeJsSetupTaskProvider)
testJs.onlyIf {
compileTask.outputFile.exists()
compileOutputFile.get().exists()
}
testJs.targetName = listOfNotNull(target.disambiguationClassifier, disambiguationClassifier)
@@ -27,7 +27,7 @@ open class YarnPlugin : Plugin<Project> {
val nodeJs = NodeJsRootPlugin.apply(this)
registerTask<YarnSetupTask>(YarnSetupTask.NAME) {
it.dependsOn(nodeJs.nodeJsSetupTask)
it.dependsOn(nodeJs.nodeJsSetupTaskProvider)
}
val rootClean = project.rootProject.tasks.named(BasePlugin.CLEAN_TASK_NAME)
@@ -24,9 +24,8 @@ class KotlinTestsRegistry(val project: Project, val allTestsTaskName: String = "
get() = doGetOrCreateAggregatedTestTask(
name = allTestsTaskName,
description = "Runs the tests for all targets and create aggregated report"
) {
project.tasks.maybeCreate(LifecycleBasePlugin.CHECK_TASK_NAME)
.dependsOn(it)
).also {
project.tasks.named(LifecycleBasePlugin.CHECK_TASK_NAME).dependsOn(it)
}
fun registerTestTask(