sbt - 添加在 build.sbt 之外定义的任务键

sbt - Adding a task key defined outside of build.sbt

如果我在 build.sbt 文件之外将 SBT 任务密钥定义为项目文件夹中的 Scala class,我该如何导入该任务

所以在 ./project/MyTask.scala 我有;

import sbt.Keys._
import sbt._

object MyTask {
  lazy val uname = settingKey[String]("Your name")
  lazy val printHi = taskKey[Unit]("print Hi")
  printHi := { println(s"hi ${name.value}") }
}

然后在./build.sbt我有;

import MyTask._

uname := "Joe"

然后当我 运行 sbt printHi 时,我得到一个错误,说找不到任务。 运行 show uname 也有效。当我直接在 build.sbt 中定义 printHi 而没有对象导入时,一切都按预期工作。

我需要以某种方式将此任务添加到 build.sbt 文件中。我该怎么做?

问题是您的表达式 printHi := { println(s"hi ${name.value}") } 没有关联到任何东西。

首先,sbt 中的所有内容都是一个转换,在本例中 (:=) 覆盖任何先前设置的 printHi 到您给出的定义 (println(s"hi ${name.value}"))。但是,通过不将该表达式(它是一个 Setting[Task[Unit]])与任何东西(例如一个项目,或者作为一个值附加到一个项目)相关联,它只是在 [=17= 的构造中被评估] 对象,然后扔掉。

一种方法是将该设置 (printHi := println(s"hi ${name.value}")) 放入 Seq[Setting[_]] 中,然后将其拉入 build.sbt:

project/MyTask.scala

import sbt._, Keys._

object MyTask {
  val printHi = taskKey[Unit]("prints Hi")
  val myTaskSettings = Seq[Setting[_]](
    printHi := println(s"hi ${name.value}")
  )
}

build.sbt

import MyTask._

myTaskSettings

另一种方法是将 MyTask 定义为 project/ 中的迷你插件。您可以在 PgpCommonSettings.

中查看示例