Подтвердить что ты не робот

В sbt, как вы переопределяете scalacOptions для консоли во всех конфигурациях?

Мне нравится определять scalacOptions на верхнем уровне (так, например, игнорируя ось проекта):

scalacOptions += "-Ywarn-unused-import"

Но потом я понял, что слишком строго для console. Поэтому я попытался установить:

scalacOptions in console ~= (_ filterNot (_ == "-Ywarn-unused-import"))

Но это не сработало (все еще получили (фатальные) предупреждения в REPL).

Я использовал inspect, чтобы попытаться понять, почему:

> inspect console
[info] Task: Unit
[info] Description:
[info]  Starts the Scala interpreter with the project classes on the classpath.
[info] Provided by:
[info]  {file:/a/}b/compile:console
[info] Defined at:
[info]  (sbt.Defaults) Defaults.scala:261
[info] Dependencies:
[info]  compile:console::compilers
[info]  compile:console::initialCommands
[info]  compile:console::fullClasspath
[info]  compile:console::taskTemporaryDirectory
[info]  compile:console::scalaInstance
[info]  compile:console::streams
[info]  compile:console::cleanupCommands
[info]  compile:console::scalacOptions
[info] Delegates:
[info]  compile:console
[info]  *:console
[info]  {.}/compile:console
[info]  {.}/*:console
[info]  */compile:console
[info]  */*:console
[info] Related:
[info]  test:console

Примечание: console есть

  • предоставляется compile:console
  • зависит от compile:console::scalacOptions

то

> inspect compile:console::scalacOptions
[info] Task: scala.collection.Seq[java.lang.String]
[info] Description:
[info]  Options for the Scala compiler.
[info] Provided by:
[info]  {file:/a/}b/compile:scalacOptions
[info] Defined at:
[info]  (sbt.Classpaths) Defaults.scala:1593
[info] Reverse dependencies:
[info]  compile:console
[info] Delegates:
[info]  compile:console::scalacOptions
[info]  compile:scalacOptions
[info]  *:console::scalacOptions
[info]  *:scalacOptions
[info]  {.}/compile:console::scalacOptions
[info]  {.}/compile:scalacOptions
[info]  {.}/*:console::scalacOptions
[info]  {.}/*:scalacOptions
[info]  */compile:console::scalacOptions
[info]  */compile:scalacOptions
[info]  */*:console::scalacOptions
[info]  */*:scalacOptions
[info] Related:
[info]  *:console::scalacOptions
[info]  compile:scalacOptions
[info]  *:scalacOptions
[info]  */*:scalacOptions
[info]  test:scalacOptions

Примечание: compile:console::scalacOptions есть

  • предоставляется compile:scalacOptions
  • не достигает *:console::scalacOptions (который я определил) в цепочке делегирования

Мой вопрос в том, как переопределить scalacOptions для всех конфигураций консоли? Можно ли изменить цепочку делегирования?

Мне бы хотелось не устанавливать scalacOptions in (Compile, console) (как это было бы продублировано для (Test, console)) или определять значения параметров scalac.

4b9b3361

Ответ 1

Мой вопрос в том, как переопределить scalacOptions для всех конфигураций для консоли?

Я не думаю, что мы можем указать наличие compile:scalacOptions, предоставляемое sbt Defaults. Единственный масштаб, имеющий более высокий приоритет, - compile:console::scalacOptions. В большинстве случаев не хотелось бы, чтобы настройки Compile и Test пересекались, поэтому настройка конфигурации выше приоритета. Я не думаю, что это плохой вариант.

lazy val commonSettings = Seq(
  scalaVersion := "2.11.4",
  scalacOptions += "-Ywarn-unused-import",
  scalacOptions in (Compile, console) ~= (_ filterNot (_ == "-Ywarn-unused-import")),
  scalacOptions in (Test, console) := (scalacOptions in (Compile, console)).value
)

Можно ли изменить цепочку делегирования?

Нет, это невозможно. Там один экземпляр delegates функционирует в BuildStructure, и он инициализируется во время загрузки и используется для всех задач. Заказ выполняется в Scope.delegates.