【问题标题】:Add task to Build.scala将任务添加到 Build.scala
【发布时间】:2016-01-07 20:52:17
【问题描述】:

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

【问题讨论】:

    标签: sbt


    【解决方案1】:

    您声明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") }
        )
    }
    

    【讨论】:

    • 谢谢。我很困惑应该在哪里添加代码。我的 Build.scala 中有多个项目,但是当我将代码添加到其中一个项目时,我可以访问所有项目中的任务。我猜这是预期的行为?
    • 不知道,对子项目没什么经验。
    【解决方案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 和 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 所述。

    【讨论】:

    • 如果您不想直接用:= 定义任务,如何将任务添加到项目中?
    • 例如hwsettings ++ Seq( hello ))
    猜你喜欢
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 2011-01-08
    • 2014-03-30
    相关资源
    最近更新 更多