将任务添加到Build.scala

时间:2013-12-09 22:46:14

标签: sbt

文档http://www.scala-sbt.org/0.13.0/docs/Detailed-Topics/Tasks.html解释了如何将任务添加到build.sbt,但是如何向build.scala添加一个?感谢

2 个答案:

答案 0 :(得分:10)

您声明TaskKey的部分在两种格式中均相同:val myTask = taskKey...

您撰写Initialize[Task[T]]的部分是相同的:myTask := ...

唯一的区别是后者出现的背景。

.sbt格式中,它本身就会出现,并通过空行与其他内容分开。

.scala格式中,您必须将设置添加到项目中。这是http://www.scala-sbt.org/release/docs/Getting-Started/Full-Def.html记录的,无论我们是在谈论任务还是常规设置,都是一样的。

这是一个完整的工作示例:

import sbt._
object MyBuild extends Build {
  val myTask = taskKey[Unit]("...")
  lazy val root =
    Project(id = "MyProject", base = file("."))
      .settings(
        myTask := { println("hello") }
    )
}

答案 1 :(得分:2)

在多项目构建的一个项目中定义任务并使用“根”项目聚合其他项目时,聚合意味着子项目中的任何任务也可以从根项目运行,实际上这将运行所有子项目中的任务 - 请参阅Multi-project builds。这通常很有用,例如,在从根项目运行编译任务时编译所有子项目。但是在这种情况下,它有点令人困惑。

因此,所有项目都无法访问该任务,但可以在您定义任务的子项目和聚合(根)项目中访问该任务。该任务仍然在定义它的项目中运行,它可以在根项目中调用。

为了证明这一点,我们可以在多个子项目中定义相同的“hello”任务,这些子项目在根项目中聚合:

import sbt._
import Keys._

object Build extends Build {
  val hwsettings = Defaults.defaultSettings ++ Seq(
    organization := "organization",
    version      := "0.1",
    scalaVersion := "2.10.4"
  )

  val hello = TaskKey[Unit]("hello", "Prints hello.")

  lazy val projectA = Project(
    "a",
    file("a"),
    settings = hwsettings ++ Seq(
      hello := {println("Hello from project A!")}
    ))

  lazy val projectB = Project(
    "b",
    file("b"),
    settings = hwsettings ++ Seq(
      hello := {println("Hello from project B!")}
    ))

  lazy val projectC = Project(
    "c",
    file("c"),
    settings = hwsettings
  )

  lazy val root = Project (
    "root",
    file ("."),
    settings = hwsettings
  ) aggregate (projectA, projectB, projectC)
}

请注意,项目a和b具有“hello”任务,而c则没有。当我们从根项目中使用“hello”时,聚合会导致任务在项目a AND b:

中运行
> project root
[info] Set current project to root (in build file:/Users/trepidacious/temp/multiProjectTasks/)
> hello
Hello from project A!
Hello from project B!
[success] Total time: 0 s, completed 24-Dec-2014 23:00:23

我们也可以切换到项目a或b,而运行hello只会在我们所在的项目中运行任务:

> project a
[info] Set current project to a (in build file:/Users/trepidacious/temp/multiProjectTasks/)
> hello
Hello from project A!
[success] Total time: 0 s, completed 24-Dec-2014 23:00:27
> project b
[info] Set current project to b (in build file:/Users/trepidacious/temp/multiProjectTasks/)
> hello
Hello from project B!
[success] Total time: 0 s, completed 24-Dec-2014 23:00:30

最后,如果我们切换到项目c,则不定义hello:

> project c
[info] Set current project to c (in build file:/Users/trepidacious/temp/multiProjectTasks/)
> hello
[error] Not a valid command: hello (similar: shell, help, reload)
[error] No such setting/task
[error] hello
[error]      ^
>

可以禁用此聚合,如here所述。