【问题标题】:How to pass scalacOptions (Xelide-below) to sbt via command line如何通过命令行将 scalacOptions (Xelide-below) 传递给 sbt
【发布时间】:2016-01-06 06:45:26
【问题描述】:

我正在尝试从命令行调用 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)时使用它。

【问题讨论】:

  • 这似乎有效:$>sbt "set scalacOptions in ThisBuild ++=Seq(\"-Xelide-below\",\"0\")" 程序集。但这只是令人讨厌的恕我直言。
  • 我认为最好是添加一个新配置。但是,I couldn't figure out how yet.

标签: scala sbt scalac


【解决方案1】:

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

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 会话往往会持续很长时间,所以我个人更喜欢第二种选择。

【讨论】:

  • FWIW。如果您只需要 Scala.js 的布尔型 dev/prod 开关,您可能根本不需要这个技巧,scala.scalajs.LinkingInfo.developmentMode 已经为您做到了,请参阅scala-js.org/api/scalajs-library/latest/…
猜你喜欢
  • 2016-10-25
  • 2016-09-15
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
  • 2017-04-20
  • 1970-01-01
相关资源
最近更新 更多