2014-08-31 63 views
3

在SBT我創建一個新的配置,稱爲katebush如下:擴展的配置有什麼作用?

lazy val KateBush: Configuration = config("katebush") 

當我嘗試運行katebush:compile我得到一個錯誤。這就是我所期望的。

> katebush:compile 
[error] No such setting/task 
[error] katebush:compile 
[error]    ^

現在,我在配置定義擴展Compile,我希望從繼承的範圍拿起編譯。

lazy val KateBush: Configuration = config("katebush") extend Compile 

除非它不工作:

> katebush:compile 
[error] No such setting/task 
[error] katebush:compile 
[error]    ^

但是,如果我在默認添加到配置(在build.sbt),所以它看起來如下:

lazy val KateBush: Configuration = config("katebush") extend Compile 

inConfig(KateBush)(Defaults.compileSettings) 

它的工作原理細:

> katebush:compile 
[info] Updating {file:/Users/jacek/sandbox/so-25596360/}so-25596360... 
[info] Resolving org.fusesource.jansi#jansi;1.4 ... 
[info] Done updating. 
[success] Total time: 0 s, completed Aug 31, 2014 11:35:47 PM 

S o,我的問題是,extend對於配置究竟做了什麼?

回答

3

免責聲明我對sbt的config概念有一個相當基本的理解。

tl; dr擴展配置僅用於繼承依賴關係組而非設置。

final case class Configuration來源:

def extend(configs: Configuration*) = Configuration(name, description, isPublic, configs.toList ::: extendsConfigs, transitive) 

默認情況下,extendsConfigsNil如可以在sbt.Configurations對象可以看出:

def config(name: String) = new Configuration(name) 

that resolves to(注意Nil

def this(name: String) = this(name, "", true, Nil, true) 

sbt.IvySbt.toIvyConfiguration

import org.apache.ivy.core.module.descriptor.{ Configuration => IvyConfig } 

而這也正是該config概念的支持,SBT和常春藤步驟結束這就是你不得不看常春藤的文檔。

但在此之前閱讀Advanced configurations example的地方說:

這是一個例子.scala構建定義,演示如何使用常春藤 配置,以組依賴關係

這就是解釋的開始。常春藤配置是對組依賴性和配置是擴展分組。

the official documentation of Ivy about the conf element

的結構是使用或構建模塊的方式(...) 一個模塊可能只需要在生成時一些其他模塊和工件,並在運行時一些人。 。在Ivy模塊配置中調用所有這些不同的方式來使用或構建模塊。

沿着你閱讀可以找到問題的答案(即我自己還沒有消化,太):

的配置還可以延長相同 模塊的一個或多個其他的。當一個配置延伸另一個配置時,擴展配置中所需的所有工件 也將在 配置中需要,該擴展另一個配置。例如,如果 配置B擴展了配置A,並且如果配置A需要art1和 art2,那麼它們將自動配置B中需要的 。另一方面, 配置B中所需的工件不一定是必需的在配置A.

這個概念是非常有用的定義類似 有一些差異的配置。

在頁面的底部,有個例子部分與已runtime配置的例子「運行時間將由所有依賴的,所有的傳遞性,包括僅在編譯聲明的依賴。」

有了這個,你現在可以理解SBT的config觀爲依賴關係組,以及在Compile真實分組在Runtimeits definition looks as follows可用:

lazy val Runtime = config("runtime") extend (Compile) 
+0

意想不到的答覆表示感謝。相反,這是所有的延伸失望。 – monkjack 2014-08-31 22:43:19

+0

你還會期待什麼?設置是sbt,而配置來自Ivy。也許sbt會做得更多,但它們是不同的概念 - 配置(Ivy /依賴)vs範圍(sbt /命名空間)。 – 2014-08-31 22:48:16

+0

我會期望一個配置從父配置繼承任務/設置。這是SBT - 我不在乎引擎蓋下的常春藤做什麼,我也不應該。 – monkjack 2014-08-31 22:52:29

0

我剛纔不得不想出解決辦法,所以我認爲這值得澄清。必須將該配置添加到項目中才能進行擴展配置:

lazy val KateBush: Configuration = config("katebush") extend Compile 

lazy val root = (project in file(".")).configs(KateBush) 

將正常工作。如果您

inspect katebush:compile 

那麼你可以查看委託鏈:

... 
[info] Delegates: 
[info] katebush:compile 
[info] compile:compile 
[info] *:compile 
[info] {.}/katebush:compile 
[info] {.}/compile:compile 
[info] {.}/*:compile 
[info] */katebush:compile 
[info] */compile:compile 
[info] */*:compile 
...