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

Nig*_*olf 3 scala sbt

如果我在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文件中。我怎样才能做到这一点?

Dal*_*and 5

问题是您的表情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中看到一个示例。