【问题标题】:sbt - Adding a task key defined outside of build.sbtsbt - 添加在 build.sbt 之外定义的任务键
【发布时间】:2015-05-29 23:48:00
【问题描述】:

如果我在我的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 文件中。我该怎么做?

【问题讨论】:

  • 为了更好的谷歌搜索体验:如何在 build.sbt 之外的单独文件中定义 sbt 任务

标签: scala sbt


【解决方案1】:

问题是您的表达式 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

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 中看到这样的示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 2018-04-13
    • 2012-01-23
    • 2018-07-19
    • 1970-01-01
    相关资源
    最近更新 更多