SBT中的每个项目任务

时间:2019-01-27 21:43:20

标签: scala sbt

我的.sbt文件看起来像这样:

lazy val common = (project in file("./common"))
  .settings(
    // other settings
  )
lazy val one = (project in file("./one"))
  .dependsOn(common)
  .settings(
    // other settings
    addCommandAlias("build", ";clean;assembly;foo")
  )
lazy val two = (project in file("./two"))
  .dependsOn(common)
  .settings(
    // other settings
    addCommandAlias("build", ";clean;compile;bar")
  )

此外,我还有两个任务foobar,它们仅在各自的项目中有效。

我的测试表明,无论我在哪个项目中,调用build时-两个别名都被调用。

对于任务,密钥只能已经在.sbt文件的顶级定义(例如val foo = taskKey[Unit]("Does foo"))。

我想知道如何在项目级别正确实现任务和命令别名。

有可能吗?

1 个答案:

答案 0 :(得分:2)

您遇到的问题是sbt中的别名。定义别名后,它将以命令的形式附加到范围GlobalScope,因此可用于所有子项目。当您使用addCommandAlias进行别名的多个定义时,最后一次执行将获胜,因为每个执行都将删除先前创建的具有相同名称的别名。

通过运行sbt alias可以看到已定义的别名,它将显示只有一个build别名。

通过将build引入taskKey

,可以实现lazy val build = taskKey[Unit]("Builds") lazy val root = (project in file(".")) .aggregate(one, two) // THIS IS NEED TO MAKE build TASK AVAILABLE IN ROOT lazy val common = (project in file("./common")) .settings( //SOME KEYS ) lazy val one = (project in file("./one")) .dependsOn(common) .settings( build := { Def.sequential(clean, Compile / compile).value } ) lazy val two = (project in file("./two")) .dependsOn(common) .settings( build := { Def.sequential(clean, assembly).value } ) 的分离。
Def.sequential

编辑:根据评论中@laughedelic的建议,添加了SELECT AVG (COUNT (PID)) FROM SOLD GROUP BY DATE, PID;