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

时间:2015-03-26 03:00:12

标签: 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}") }
}

然后在 ./ build.sbt 我有;

import MyTask._

uname := "Joe"

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

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

1 个答案:

答案 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中找到相关示例。