在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"))
}