在 sbt 中,如何在所有配置中覆盖控制台的 scalacOptions? [英] In sbt, how do you override scalacOptions for console in all configurations?

查看:37
本文介绍了在 sbt 中,如何在所有配置中覆盖控制台的 scalacOptions?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我喜欢像这样在顶层定义 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.在大多数情况下,人们不希望 CompileTest 设置交叉,因此我认为配置范围更高的优先级不是一个糟糕的默认设置.

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆