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