sbt 究竟是如何算出任务名称的?

How exactly sbt figures out task names?

假设build.sbt

中有这样的东西
val printMessage = taskKey[Unit]("Simple task")

printMessage := {
    println("Hello")
}

sbt 如何确定这个任务被称为 printMessage 并在没有包含该文本的字符串时使其在 CLI 中可用?我会理解代码是否类似于 val printMessage = taskKey[Unit]("printMessage", "description") 但这真的让我感到困惑

SBT 有一个 macrosbt.std.KeyMacro.taskKeyImpl 它采用 String 描述并从定义 val 的名称推断任务名称。

这个宏在sbt包对象中aliasedtaskKey[T]

因此,当您调用 taskKey[Unit]("SimpleTask") 时,它会扩展为找到 val printMessage 并使用它来推断任务键名称的宏。