我试图从命令行调用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)。
答案 0 :(得分: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会话往往会存在很长时间,所以我个人更喜欢第二种选择。