2014-09-01 81 views
4

我認爲inConfig(conf)(settings)會複製所有設置到給定的配置。但這似乎沒有達到我所期望的。爲什麼inConfig(conf)(設置)不選擇某些設置?

給定的配置:

lazy val Monkjack: Configuration = config("monkjack") 

然後我做的:

inConfig(Monkjack)(Defaults.compileSettings) 

所以我可以做編譯爲我所期望的:

sbt clean monkjack:compile 
[info] Compiling 17 Scala sources to ... 
[success] Total time: 9 s, completed 01-Sep-2014 09:40:41 

所以現在我想調整使用這個新配置時的scalac選項(實際選項是不可撤銷的,這個只是有用的,因爲它有冗長的ou tput的所以很容易看出其是否正在使用或不):

scalacOptions in Monkjack := Seq("-Yshow-syms") 

當我monjack:compile,我沒有看到觸發此選項。這就像上面的線沒有添加。但是,如果我還添加了以下幾行,它就可以工作!

sources in Monkjack := (sources in Compile).value 
sourceDirectory in Monkjack := (sourceDirectory in Compile).value, 

那麼,爲什麼我需要的最後兩行,什麼是inConfig實際上做如果不做我的期望。另外一個奇怪的是,當我這樣做時,儘管它有效,但我得到了兩個編譯階段,一個到target/classes,另一個到target/monkjack-classes

編輯(檢查而不源/ sourceDirectory設置)

> inspect tree monkjack:compile 
[info] monkjack:compile = Task[sbt.inc.Analysis] 
[info] +-monkjack:compile::compileInputs = Task[sbt.Compiler$Inputs] 
[info] | +-*:compilers = Task[sbt.Compiler$Compilers] 
[info] | +-monkjack:sources = Task[scala.collection.Seq[java.io.File]] 
[info] | +-*/*:maxErrors = 100 
[info] | +-monkjack:incCompileSetup = Task[sbt.Compiler$IncSetup] 
[info] | +-monkjack:compile::streams = Task[sbt.std.TaskStreams[sbt.Init$ScopedKey[_ <: Any]]] 
[info] | | +-*/*:streamsManager = Task[sbt.std.Streams[sbt.Init$ScopedKey[_ <: Any]]] 
[info] | | 
[info] | +-*/*:sourcePositionMappers = Task[scala.collection.Seq[scala.Function1[xsbti.Position, scala.Option[xsbti.Position]]]] 
[info] | +-monkjack:dependencyClasspath = Task[scala.collection.Seq[sbt.Attributed[java.io.File]]] 
[info] | +-monkjack:classDirectory = target/scala-2.11/monkjack-classes 
[info] | +-monkjack:scalacOptions = Task[scala.collection.Seq[java.lang.String]] 
[info] | +-*:javacOptions = Task[scala.collection.Seq[java.lang.String]] 
[info] | +-*/*:compileOrder = Mixed 
[info] | 
[info] +-monkjack:compile::streams = Task[sbt.std.TaskStreams[sbt.Init$ScopedKey[_ <: Any]]] 
[info]  +-*/*:streamsManager = Task[sbt.std.Streams[sbt.Init$ScopedKey[_ <: Any]]] 
[info]  
+0

你可以做'show monkjack:scalacOptions'嗎? – 2014-09-01 09:30:21

+0

您是否看到'inspect tree monkjack:compile'中列出的'monkjack:scalacOptions'? – 2014-09-01 09:40:02

+0

> show monkjack:scalacOptions [info] List(-Yshow-syms) – monkjack 2014-09-01 09:53:21

回答

3

TL;博士否源爲新配置是指沒有編譯,因此沒有使用的scalacOptions

When to define your own configuration

如果你的插件或者引入一套新的源代碼,或自己的庫的依賴,只有這樣,你希望自己的配置。

inConfig確實的(重新)映射僅所以所有的鍵被初始化爲一給定的範圍 - 在這種情況下monkjack配置。

換句話說,inConfig計算新範圍內設置的值。

的巨大影響的設置在這裏是sourceDirectorysourceManaged了在sourceConfigPaths設置(在Defaults.sourceConfigPaths)如下:

lazy val sourceConfigPaths = Seq(
    sourceDirectory <<= configSrcSub(sourceDirectory), 
    sourceManaged <<= configSrcSub(sourceManaged), 
    ... 
) 

configSrcSubgives the answer(稍微重新格式化,以緩解讀):

def configSrcSub(key: SettingKey[File]): Initialize[File] = 
    (key in ThisScope.copy(config = Global), configuration) { (src, conf) => 
    src/nameForSrc(conf.name) 
    } 

這導致了一個答案,如果你將你的消息來源轉移到src/monkjack/scala那可以正常工作。這是一個在Scoping by configuration axis描述:

配置定義構建的味道,可能與它自己的類路徑,來源,產生包等(...) 默認情況下,所有的編譯,打包相關聯的密鑰,並且運行範圍限定爲配置,因此可能在每個配置中都有不同的工作方式。

+0

所以我需要一個調整monkjack的配置:通過添加一些額外的scalacOptions來編譯範圍。我想我可以調整編譯範圍本身,而不是引入新的配置。 – monkjack 2014-09-01 10:52:47

+0

這就是新配置背後的想法 - 改變不止一些設置,否則可能會使用更簡單的方式進行更改。 – 2014-09-01 11:52:18

+0

我需要做很多比我的問題表明,雖然:) – monkjack 2014-09-01 12:20:21

相關問題