什么扩展配置呢?

时间:2014-08-31 21:15:12

标签: sbt

在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

所以,我的问题是,配置的确是extend到底是什么?

2 个答案:

答案 0 :(得分:4)

免责声明我对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和Ivy的步骤。这就是你必须查看常春藤文档的地方。

但在此之前阅读Advanced configurations example,其中说:

  

这是一个使用 Ivy演示的.scala构建定义示例   用于对依赖项进行分组的配置

这是解释的开始。常春藤配置是对依赖关系进行分组,extend配置是扩展分组。

来自the official documentation of Ivy about the conf element

  

配置是一种使用或构建模块的方法。(...)   模块可能仅在构建时需要一些其他模块和工件,而在运行时可能需要其他一些模块和工件。所有这些不同的使用或构建模块的方法都在Ivy模块配置中调用。

一起阅读你可以找到你问题的答案(我自己还没有消化):

  

配置还可以扩展一个或多个其他配置   模块。当配置扩展另一个,然后是所有工件   在扩展配置中也需要   扩展另一个的配置。例如,如果   配置B扩展配置A,如果是工件art1和   在配置A中需要art2,然后它们将自动生成   在配置B中需要。另一方面,需要工件   配置A中不一定需要配置B.

     

这个概念对于定义相似的配置非常有用   有一些差异。

在页面的底部,有 Examples 部分,其中包含runtime config的示例,“运行时将由所有依赖项组成,所有依赖项都包含在内,包括仅在编译时声明的依赖项。“

有了这个,您现在可以将sbt中的config概念理解​​为依赖关系组,并CompileRuntime中的lazy val Runtime = config("runtime") extend (Compile) 分组内容为its definition looks as follows

{{1}}

答案 1 :(得分: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
...