Как передать scalacOptions (Xelide-ниже) в sbt через командную строку

Я пытаюсь вызвать sbt assembly из командной строки, передав ей флаг компилятора scalac в elides (elide -ниже 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).


person Armin    schedule 06.01.2016    source источник
comment
Кажется, это работает: $›sbt устанавливает scalacOptions в сборке ThisBuild ++=Seq(\-Xelide-below\,\0\). Но это просто отвратительно ИМХО.   -  person Armin    schedule 06.01.2016
comment
Я думаю, что лучше всего было бы добавить новую конфигурацию. Однако я пока не мог понять, как это сделать.   -  person 0__    schedule 06.01.2016


Ответы (1)


Один из способов передать уровень elide в качестве параметра командной строки — использовать системные свойства.

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

и запустите sbt -Delide.below=20 assembly. Быстро, грязно и легко.

Еще один более подробный способ сделать то же самое — определить разные команды для создания артефактов test/prod.

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, как правило, живут долго, поэтому лично я предпочитаю второй вариант.

person Ólafur Páll Geirsson    schedule 06.01.2017
comment
ПОМОЩЬ. Вам может вообще не понадобиться этот трюк, если вам нужен только логический переключатель dev/prod для Scala.js, scala.scalajs.LinkingInfo.developmentMode уже делает это за вас, см. scala-js.org/api/scalajs-library/latest/ - person Ólafur Páll Geirsson; 07.01.2017