diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/TaskManager.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/TaskManager.kt index 4a0c6acb..ec371a5f 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/TaskManager.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/TaskManager.kt @@ -81,7 +81,17 @@ class TaskManager @Inject constructor(val args: Args, } fun runTargets(passedTaskNames: List, allProjects: List): RunTargetResult { - val taskInfos = calculateDependentTaskNames(passedTaskNames, allProjects) + // Check whether tasks passed at command line exist + passedTaskNames.forEach { + if (!hasTask(TaskInfo(it))) + throw KobaltException("Unknown task: $it") + } + + var taskInfos = calculateDependentTaskNames(passedTaskNames, allProjects) + + // Remove not existing tasks (e.g. dynamic task defined for a single project) + taskInfos = taskInfos.filter { hasTask(it) } + val projectsToRun = findProjectsToRun(taskInfos, allProjects) return runProjects(taskInfos, projectsToRun) } @@ -269,9 +279,6 @@ class TaskManager @Inject constructor(val args: Args, // Keep only the tasks we need to run. // val taskInfos = passedTasks.filter { - if (!nodeMap.keys().contains(it.taskName)) { - throw KobaltException("Unknown task: $it") - } it.matches(projectName) } @@ -485,6 +492,12 @@ class TaskManager @Inject constructor(val args: Args, alwaysRunAfter.forEach { alwaysRunAfter(it, name) } } + fun hasTask(ti: TaskInfo): Boolean { + val taskName = ti.taskName + val project = ti.project + return annotationTasks.any { taskName == it.name && (project == null || project == it.project.name) } + } + /** * Invoked by the server whenever it's done processing a command so the state can be reset for the next command. */