5

我试图从命令行调用 sbt程序集,将 scalac 编译器标志传递给 elides(elide-below 1)。

通过将此行添加到 build.sbt,我设法使标志在 build.sbt 中工作

scalacOptions ++= Seq("-Xelide-below", "1")

当我启动 sbt 并运行以下命令时,它工作正常:

$> sbt                                                                                                                        
$> set scalacOptions in ThisBuild ++=Seq("-Xelide-below", "0")

但是我想知道在启动 sbt 时如何传递它,以便我的 CI 工作可以在执行不同的组装目标(即 dev/test/prod)时使用它。

4

1 回答 1

5

将 elide 级别作为命令行选项传递的一种方法是使用系统属性

scalacOptions ++= Seq("-Xelide-below", sys.props.getOrElse("elide.below", "0"))

并运行sbt -Delide.below=20 assembly。快速,肮脏和容易。

完成同一件事的另一种更详细的方法是定义不同的命令来生成测试/产品工件。

lazy val elideLevel = settingKey[Int]("elide code below this level.")
elideLevel in Global := 0
scalacOptions ++= Seq("-Xelide-below", elideLevel.value.toString)
def assemblyCommand(name: String, level: Int) =
  Command.command(s"${name}Assembly") { s =>
    s"set elideLevel in Global := $level" ::
      "assembly" ::
      s"set elideLevel in Global := 0" ::
      s
  }
commands += assemblyCommand("test", 10)
commands += assemblyCommand("prod", 1000)

你可以运行sbt testAssembly prodAssembly. 这为您提供了一个更简洁的命令名称,同时您不必退出活动的 sbt-shell 会话即可调用例如testAssembly. 我的 sbt-shell 会话往往会持续很长时间,所以我个人更喜欢第二种选择。

于 2017-01-06T12:35:29.567 回答