【问题标题】:Define Compound Task in SBT在 SBT 中定义复合任务
【发布时间】:2023-03-03 10:33:01
【问题描述】:

我想在 sbt 中定义一个复合任务,以便在我的 CI 作业中运行的所有任务都可以在单个命令中执行。例如在我跑步的那一刻:

clean coverage test scalastyle coverageReport package

不过我只想运行

ci

这实际上是上述所有任务的别名。此外,我想在一个 scala 文件中定义它(而不是 build.sbt),这样我就可以将它包含在一个已经存在的通用 scala 插件中,因此它对我的所有项目都可用。

到目前为止(在大量阅读文档之后)我已经设法完成了一项仅依赖于 scalastyle 的任务:

lazy val ci = inputKey[Unit]("Prints 'Runs All tasks for CI")
ci := {
        val scalastyleResult = (scalastyle in Compile).evaluated
        println("In the CI task")
}

但是,如果我尝试添加另一个任务(例如发布任务),例如:

ci := {
        val scalastyleResult = (scalastyle in Compile).evaluated
        val publishResult = (publish in Compile).evaluated
        println("In the CI task")
}

这失败了:

[error] [build.sbt]:52: illegal start of simple expression
[error] [build.sbt]:55: ')' expected but '}' found.

我的第一个问题是这种方法是否确实是定义复合任务的正确方法。

如果是这种情况,那么我怎样才能使 ci 任务依赖于提到的所有任务。

【问题讨论】:

    标签: scala sbt


    【解决方案1】:
    lazy val ci = inputKey[Unit]("Prints 'Runs All tasks for CI")
    ci := {
    

    在语句之间留一个空格

    lazy val ci = inputKey[Unit]("Prints 'Runs All tasks for CI")
    
    ci := {
    

    另外,要知道 SBT 将并行运行您依赖的 ci 任务。有时这很好,但并非总是如此,例如在你的清洁中。

    有几种方法可以按顺序运行任务。

    一种方式:

    commands += Command.command("ci") {
      "clean" ::
      "coverage" ::
      "test" ::
      "scalastyle" ::
      "coverageReport" ::
      _
    }
    

    【讨论】:

    • 是的,效果很好,谢谢。出于兴趣,定义该命令的语法如何工作? IE。看起来您正在将 cons 应用于许多字符串,但它们是如何转换为动作的,下划线最后在做什么?
    • @d80tb7,下划线是函数中的下一个(在这种情况下是第一个也是唯一的)参数。可以写成{ state => "a" :: "b" :: state }
    猜你喜欢
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    相关资源
    最近更新 更多