簡體   English   中英

在sbt中,如何在所有配置中覆蓋控制台的scalacOptions?

[英]In sbt, how do you override scalacOptions for console in all configurations?

我喜歡在頂層定義scalacOptions ,如此(例如, 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
  • 取決於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提供compile:scalacOptions
  • 在委托鏈中沒有達到*:console::scalacOptions (這是我定義的)

我的問題是如何為控制台的所有配置覆蓋scalacOptions 是否可以更改授權鏈?

我想避免scalacOptions in (Compile, console)設置scalacOptions in (Compile, console) (因為它會被復制(Test, console) )或定義一個scalac選項的val。

我的問題是如何為控制台的所有配置覆蓋scalacOptions

我不認為我們可以提供compile:scalacOptions由sbt的Defaults 唯一具有更高優先級的范圍是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中完成。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM