В 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.
Ответы
Ответ 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.