Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sbt 将任务添加到Build.scala_Sbt - Fatal编程技术网

Sbt 将任务添加到Build.scala

Sbt 将任务添加到Build.scala,sbt,Sbt,本文档说明了如何将任务添加到build.sbt,但如何将任务添加到build.scala?谢谢声明任务键的部分在两种格式中都是相同的:val myTask=TaskKey… 编写初始化[Task[T]的部分是相同的:myTask:=… 唯一的区别是后者出现的背景 在.sbt格式中,它会自动出现,并用空行与其他内容隔开 在.scala格式中,必须将设置添加到项目中。无论我们讨论的是任务还是常规设置,这都是记录在案的,并且是相同的 下面是一个完整的工作示例: import sbt._ object

本文档说明了如何将任务添加到build.sbt,但如何将任务添加到build.scala?谢谢

声明任务键的部分在两种格式中都是相同的:
val myTask=TaskKey…

编写
初始化[Task[T]
的部分是相同的:
myTask:=…

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

.sbt
格式中,它会自动出现,并用空行与其他内容隔开

.scala
格式中,必须将设置添加到项目中。无论我们讨论的是任务还是常规设置,这都是记录在案的,并且是相同的

下面是一个完整的工作示例:

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

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

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

为了证明这一点,我们可以在多个子项目中定义相同的“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和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]      ^
>

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

谢谢。我感到困惑的是,应该在哪里添加代码位。我的Build.scala中有多个项目,但是当我只向其中一个项目添加代码时,我可以访问所有项目中的任务。我猜这是预期的行为?不知道,对子项目的经验很少。如果不想用
:=
?例如,
hwsettings++Seq(hello))
定义任务,如何将任务添加到项目中