在 sbt 中,如何在所有配置中覆盖控制台的 scalacOptions? [英] In sbt, how do you override scalacOptions for console in all configurations?
问题描述
我喜欢像这样在顶层定义 scalacOptions
(例如,现在忽略项目轴):
scalacOptions += "-Ywarn-unused-import"
但后来我意识到这对控制台
来说太严格了.所以我尝试设置:
scalacOptions in console ~= (_ filterNot (_ == "-Ywarn-unused-import"))
但这不起作用(REPL 中仍然有(致命的)警告).
我使用 inspect
来尝试理解原因:
<代码>>检查控制台[信息] 任务:单位[信息] 说明:[信息] 使用类路径上的项目类启动 Scala 解释器.[信息] 提供者:[信息] {file:/a/}b/compile:console[信息] 定义于:[信息] (sbt.Defaults) Defaults.scala:261[信息] 依赖项:[信息] 编译:控制台::编译器[信息] compile:console::initialCommands[信息] compile:console::fullClasspath[信息] compile:console::taskTemporaryDirectory[信息] compile:console::scalaInstance[信息] compile:console::streams[信息] compile:console::cleanupCommands[信息] compile:console::scalacOptions[信息] 代表:[信息] 编译:控制台[信息] *:控制台[信息] {.}/compile:console[信息] {.}/*:控制台[信息] */编译:控制台[信息] */*:控制台[信息]相关:[信息] 测试:控制台
注意:控制台
是
- 由
compile:console
提供 - 依赖于
compile:console::scalacOptions
然后:
<代码>>检查编译:控制台::scalacOptions[信息] 任务:scala.collection.Seq[java.lang.String][信息] 说明:[信息] Scala 编译器的选项.[信息] 提供者:[信息] {file:/a/}b/compile:scalacOptions[信息] 定义于:[信息] (sbt.Classpaths) Defaults.scala:1593[信息] 反向依赖:[信息] 编译:控制台[信息] 代表:[信息] compile:console::scalacOptions[信息] 编译:scalacOptions[信息] *:console::scalacOptions[信息] *:scalacOptions[信息] {.}/compile:console::scalacOptions[信息] {.}/compile:scalacOptions[信息] {.}/*:console::scalacOptions[信息] {.}/*:scalacOptions[信息] */compile:console::scalacOptions[信息] */compile:scalacOptions[信息] */*:console::scalacOptions[信息] */*:scalacOptions[信息]相关:[信息] *:console::scalacOptions[信息] 编译:scalacOptions[信息] *:scalacOptions[信息] */*:scalacOptions[信息] 测试:scalacOptions
注意:compile:console::scalacOptions
是
- 由
compile:scalacOptions
提供 - 没有到达委托链中的
*:console::scalacOptions
(这是我定义的)
我的问题是如何为控制台的所有配置覆盖 scalacOptions
?是否可以更改委托链?
我想避免在 (Compile, console) 中设置 scalacOptions(因为它会为
(Test, console)
重复)或定义一个 valscalac 选项.
我的问题是如何为控制台的所有配置覆盖
scalacOptions
?
我认为我们无法提供 sbt 的 Defaults
提供的 compile:scalacOptions
.唯一具有更高优先级的作用域是 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)
<块引用>
是否可以更改委托链?
不,这是不可能的.BuildStructure 中有一个 delegates
函数的实例a>,它在加载时初始化并用于所有任务.排序在 Scope 中完成.delegates.
I like defining scalacOptions
at the top level like so (as an example, ignoring project axis for now):
scalacOptions += "-Ywarn-unused-import"
But then I realised that's too strict for console
. So I tried setting:
scalacOptions in console ~= (_ filterNot (_ == "-Ywarn-unused-import"))
But that didn't work (still got (fatal) warnings in the REPL).
I used inspect
to try and understand why:
> 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
Note: console
is
- provided by
compile:console
- depends on
compile:console::scalacOptions
then:
> 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
Note: compile:console::scalacOptions
is
- provided by
compile:scalacOptions
- doesn't reach
*:console::scalacOptions
(which is what I defined) in the delegation chain
My question is how do I override scalacOptions
for all configurations for console? Is it possible to change the delegation chain?
I'd like to avoid having to set scalacOptions in (Compile, console)
(as it would be duplicated for (Test, console)
) or define a val of scalac options.
My question is how do I override
scalacOptions
for all configurations for console?
I don't think we can given the presence of compile:scalacOptions
provided by sbt's Defaults
. The only scope that has higher precedence is compile:console::scalacOptions
.
In most cases one would not want Compile
and Test
settings to cross wire, so configuration scoping higher precedence I don't think is a bad default.
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
)
Is it possible to change the delegation chain?
No, this is not possible.
There's a single instance of delegates
function in BuildStructure, and it's initialized at the loading time and used for all tasks.
The ordering is done in Scope.delegates.
这篇关于在 sbt 中,如何在所有配置中覆盖控制台的 scalacOptions?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!