scala - 如何通过命令行将 scalacOptions(Xelide-below)传递给 sbt

标签 scala sbt scalac

我想调用 sbt assembly从命令行将 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)时使用它。

最佳答案

将 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 session 即可调用例如 testAssembly .我的 sbt-shell session 往往会持续很长时间,所以我个人更喜欢第二种选择。

关于scala - 如何通过命令行将 scalacOptions(Xelide-below)传递给 sbt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34627179/

相关文章:

scala - 如何 mavenize Scala/Akka/Play 项目?

scala - scala 编译器阶段的顺序是什么?

scala - Scala 按名称参数的使用

scala - 在 akka-http 中使用handleWebsocketMessage

scala - scrooge-sbt-plugin 的存储库是什么?

scala - 干扰 Scala 动态特征的方法解析的字段?

scala Ywarn-all 用法

Scala 集合 : array groupBy and return array indexes for each group

scala - 类型成员为 : what is Scala's object vs module system ? 的对象(试图理解 2014 年 Odersky 关于路径相关类型的论文)

playframework - 将 version.sbt 中定义的 ThisBuild 设置中的版本值传递给artifactName?