如果我将build.sbt
文件之外的SBT任务键定义为项目文件夹中的Scala类,我该如何导入该任务
所以在 ./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文件中。我怎么能这样做?
答案 0 :(得分:4)
问题是您的表达式printHi := { println(s"hi ${name.value}") }
与任何内容都没有关联。
首先,sbt中的所有内容都是转换,在这种情况下(:=
)会将printHi
之前的任何设置覆盖到您给定的定义(println(s"hi ${name.value}")
)。但是,如果不将该表达式(它是Setting[Task[Unit]]
)与任何事物(例如项目,或作为随后附加到项目的值)相关联,则只需在{{1}的构造中对其进行评估。对象然后扔掉。
执行此操作的一种方法是将该设置(MyTask
)放在printHi := println(s"hi ${name.value}")
中,然后将其设置为Seq[Setting[_]]
:
<强>项目/ MyTask.scala 强>
build.sbt
<强> build.sbt 强>
import sbt._, Keys._
object MyTask {
val printHi = taskKey[Unit]("prints Hi")
val myTaskSettings = Seq[Setting[_]](
printHi := println(s"hi ${name.value}")
)
}
另一种方法是将import MyTask._
myTaskSettings
定义为一个位于MyTask
的迷你插件。您可以在PgpCommonSettings中找到相关示例。