如果我在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}") }
}
Run Code Online (Sandbox Code Playgroud)
然后在./build.sbt我有;
import MyTask._
uname := "Joe"
Run Code Online (Sandbox Code Playgroud)
然后,当我运行时,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]])与任何事物(例如,与项目或作为附加到项目的值)相关联,它只会在MyTask对象的构造中被求值,然后被丢弃。
一种方法是将设置(printHi := println(s"hi ${name.value}"))放入其中Seq[Setting[_]],然后将其拖入build.sbt:
项目/MyTask.scala
import sbt._, Keys._
object MyTask {
val printHi = taskKey[Unit]("prints Hi")
val myTaskSettings = Seq[Setting[_]](
printHi := println(s"hi ${name.value}")
)
}
Run Code Online (Sandbox Code Playgroud)
build.sbt
import MyTask._
myTaskSettings
Run Code Online (Sandbox Code Playgroud)
另一种方法是将其定义MyTask为生活在中的迷你插件project/。您可以在PgpCommonSettings中看到一个示例。