在sbt中,如何在所有配置中覆盖console的ScalaOptions?

在sbt中,如何在所有配置中覆盖console的ScalaOptions?,scala,sbt,Scala,Sbt,我喜欢这样在顶层定义scalacOptions(例如,现在忽略项目轴): 但后来我意识到这对于控制台来说太严格了。所以我试着设置: scalacOptions in console ~= (_ filterNot (_ == "-Ywarn-unused-import")) 但这并没有起作用(REPL中仍然有(致命的)警告) 我使用inspect尝试了解原因: > inspect console [info] Task: Unit [info] Description: [info]

我喜欢这样在顶层定义
scalacOptions
(例如,现在忽略项目轴):

但后来我意识到这对于
控制台来说太严格了。所以我试着设置:

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
注意:
控制台

  • compile:console提供
  • 取决于编译:控制台::Scala选项
然后:

注意:
compile:console::scalacOptions

  • compile:scalacOptions提供
  • 未到达委派链中的
    *:console::ScalaOptions
    (这是我定义的)
我的问题是如何覆盖控制台的所有配置的
scalacOptions
?是否可以更改委派链

我希望避免必须在(编译,控制台)
中设置
scalacOptions(因为它将在
(测试,控制台)
中重复)或定义scalac选项的val

我的问题是如何覆盖控制台的所有配置的
scalacOptions

我认为,如果sbt的
Defaults
提供了
compile:scalacOptions
,我们就无法做到这一点。唯一具有较高优先级的作用域是
编译:控制台::scalacOptions
。 在大多数情况下,不希望
编译
测试
设置交叉连接,因此配置范围更高的优先级我认为不是一个坏的默认值

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
)
是否可以更改委派链

不,这是不可能的。 中有一个
委托
函数的实例,它在加载时初始化并用于所有任务。
订购在中完成。

我在autoplugin中修复了错误的scalac选项:

package console

import sbt._

/** [[FixScalacOptionsInConsole]] is an [[AutoPlugin]] that removes
  * noisy or unnecessary scalac options when running an sbt console.
  */
object FixScalacOptionsInConsole extends AutoPlugin {

  import Keys._

  override def requires = plugins.JvmPlugin
  override def trigger = allRequirements

  override lazy val projectSettings = Seq(
    Compile / console / scalacOptions ~= filter,
    Test / console / scalacOptions ~= filter
  )

  def filter: Seq[String] => Seq[String] =
    _ .filterNot(_ == "-feature")
      .filterNot(_.startsWith("-opt:"))
      .filterNot(_ == "-unchecked")
      .filterNot(_.startsWith("-Xlint:"))
      .filterNot(_ == "-Xfatal-warnings")
      .filterNot(_.startsWith("-Ywarn"))
}

另请参见感谢您的回复Eugene,特别是内脏的详细信息/链接对我来说非常有价值。我猜是设计决定在任务之前的配置中使用默认搜索(
compile:scalacOptions
before
*:console::scalacOptions
)。有没有办法让这些东西发挥作用
ivyConfigurations.value.map(c=>scalacOptions in(c,console):=consoleCompilerOptions)
(这不是)好主意!虽然我会启用所有功能,而不是过滤掉它。该插件过滤掉恼人的警告,包括那些通常由
-feature
生成的警告。当我在控制台中时,我希望使用任何语言特性,而不仅仅是那些添加到基础项目中的特性。可以通过添加附加在筛选器之后的覆盖列表轻松更改此设置。这里的要点是,您可以在不破坏项目定义的情况下,无形地修复sbt中的这个缺点。您是对的。我的意思是
-语言:
。这个插件看起来非常有用,你应该发布它:)
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
)
package console

import sbt._

/** [[FixScalacOptionsInConsole]] is an [[AutoPlugin]] that removes
  * noisy or unnecessary scalac options when running an sbt console.
  */
object FixScalacOptionsInConsole extends AutoPlugin {

  import Keys._

  override def requires = plugins.JvmPlugin
  override def trigger = allRequirements

  override lazy val projectSettings = Seq(
    Compile / console / scalacOptions ~= filter,
    Test / console / scalacOptions ~= filter
  )

  def filter: Seq[String] => Seq[String] =
    _ .filterNot(_ == "-feature")
      .filterNot(_.startsWith("-opt:"))
      .filterNot(_ == "-unchecked")
      .filterNot(_.startsWith("-Xlint:"))
      .filterNot(_ == "-Xfatal-warnings")
      .filterNot(_.startsWith("-Ywarn"))
}