2014-11-14 12 views
20

Mi piace definire scalacOptions al livello superiore in questo modo (ad esempio, ignorando l'asse del progetto per ora):In SBT, come si sostituisce scalacOptions per console in tutte le configurazioni?

scalacOptions += "-Ywarn-unused-import" 

Ma poi ho capito che è troppo rigida per console. Così ho provato a impostare:

scalacOptions in console ~= (_ filterNot (_ == "-Ywarn-unused-import")) 

Ma questo non ha funzionato (ancora ottenuto (fatale) avvisi nel REPL).

ho usato inspect per cercare di capire il perché:

> 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 

Nota: console è

  • fornito da compile:console
  • dipende compile:console::scalacOptions

poi:

> 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 

Nota: compile:console::scalacOptions è

  • fornito da compile:scalacOptions
  • non raggiunge *:console::scalacOptions (che è quello che ho definito) nella catena delegazione

mia domanda è come fare Sovrascrivo scalacOptions per tutte le configurazioni per console? È possibile cambiare la catena di delega?

Vorrei evitare di dover impostare scalacOptions in (Compile, console) (come sarebbe duplicato per (Test, console)) o definire un val di opzioni scalac.

+0

Vedere anche https: // github.com/typelevel/wartremover/issues/131 –

risposta

12

La mia domanda è come eseguire l'override di scalacOptions per tutte le configurazioni per console?

non credo che possiamo data la presenza di compile:scalacOptions fornito da SBT di Defaults. L'unico ambito con precedenza più elevata è compile:console::scalacOptions. Nella maggior parte dei casi non si vorrebbe che le impostazioni Compile e Test si incrocino, quindi la precedenza con precedenza per la definizione dell'ambito della configurazione non è un valore predefinito errato.

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 
) 

E 'possibile modificare la catena di delega?

No, questo non è possibile. C'è una singola istanza della funzione delegates in BuildStructure ed è inizializzata al momento del caricamento e utilizzata per tutte le attività. L'ordine viene effettuato in Scope.delegates.

+1

Grazie per la risposta, Eugene, in particolare i dettagli/link alle interiora sono molto preziosi per me. Immagino che sia stata presa una decisione progettuale per avere la ricerca predefinita nella configurazione prima dell'attività ('compile: scalacOptions' prima di' *: console :: scalacOptions'). –

+0

C'è un modo per far funzionare qualcosa in questo modo? 'ivyConfigurations.value.map (c => scalacOptions in (c, console): = consoleCompilerOptions)' (Non funziona) – aij

Problemi correlati