2014-08-31 64 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 
...