【问题标题】:In sbt, how do you override scalacOptions for console in all configurations?在 sbt 中,如何在所有配置中覆盖控制台的 scalacOptions?
【发布时间】:2015-01-12 10:48:18
【问题描述】:

我喜欢像这样在顶层定义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) 重复)或定义一个 val scalac 选项。

【问题讨论】:

标签: scala sbt


【解决方案1】:

我的问题是如何为控制台的所有配置覆盖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 函数实例,它在加载时初始化并用于所有任务。 订购在Scope.delegates完成。

【讨论】:

  • 感谢您的回复尤金,特别是内脏的详细信息/链接对我来说非常有价值。我想有一个设计决定是在任务之前在配置中进行默认搜索(compile:scalacOptions*:console::scalacOptions 之前)。
  • 有没有办法让这些方面的东西发挥作用? ivyConfigurations.value.map(c => scalacOptions in (c, console) := consoleCompilerOptions)(没有)
【解决方案2】:

我修复了自动插件中的错误 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"))
}

【讨论】:

  • 好主意!虽然我会启用所有功能,而不是过滤掉它。
  • 插件过滤掉恼人的警告,包括那些通常由-feature生成的警告。当我在控制台中时,我想使用任何语言功能,而不仅仅是那些已添加到基础项目中的功能。可以很容易地改变这一点,尽管通过添加一个附加在过滤器之后的覆盖列表。这里的重点是,您可以在不修改项目定义的情况下在 sbt 中隐形修复这个疣。
  • 你是对的。我的意思是-language:_。这个插件看起来真的很有用,你应该发布它:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-31
  • 1970-01-01
  • 1970-01-01
  • 2017-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多