Sbt 扩展配置的作用是什么?

Sbt 扩展配置的作用是什么?,sbt,Sbt,在SBT中,我创建了一个名为katebush的新配置,如下所示: lazy val KateBush: Configuration = config("katebush") lazy val KateBush: Configuration = config("katebush") extend Compile inConfig(KateBush)(Defaults.compileSettings) 当我试图运行katebush:compile时,我得到一个错误。这就是我所期望的 >

在SBT中,我创建了一个名为
katebush
的新配置,如下所示:

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

inConfig(KateBush)(Defaults.compileSettings)
当我试图运行
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")
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

因此,我的问题是,
为配置扩展了什么?

免责声明我对sbt的
配置
概念有了相当基本的理解

tl;dr扩展配置只是为了继承依赖项组,而不是设置

从以下来源:

默认情况下,
extendsConfigs
Nil
,可以在对象中看到:

(注意
Nil

在:

这就是
config
概念的支持在sbt和Ivy步骤中结束的地方。那就是你必须看常春藤的文件的地方

但在此之前,请阅读其中的内容:

这是一个示例。scala构建定义演示了如何使用Ivy 组依赖项的配置

这就是解释的开始。常春藤配置用于对依赖项进行分组,
extend
ing配置用于扩展分组

发件人:

配置是使用或构造模块的一种方式。(…) 模块可能只在构建时需要一些其他模块和工件,而在运行时需要一些其他模块和工件。所有这些使用或构建模块的不同方式都在常春藤模块配置中调用

一直读下去,你可以找到你问题的答案(我自己也还没有消化):

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

这个概念非常有助于定义相似的配置 有些不同

在页面底部,有一个示例部分,其中有一个带有
运行时
配置的示例,“运行时将由所有依赖项组成,所有依赖项都是可传递的,包括仅在compile中声明的依赖项。”

有了这一点,您现在可以理解sbt中的
config
概念作为依赖项组,而
Compile
中的分组内容在
运行时
中提供为:


我刚刚必须弄清楚这一点,所以我认为这是值得澄清的。必须将配置添加到项目中,以便授权到扩展配置中:

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
...

非常好的回答,谢谢。我只是很失望,你还指望什么?设置是sbt,而配置来自Ivy。也许sbt可以做得更多,但它们是不同的概念——配置(Ivy/依赖项)和作用域(sbt/名称空间)。我希望配置从父配置继承任务/设置。这是SBT-我不在乎常春藤在引擎盖下做什么,我也不应该。我能理解这个看台。我现在更愿意遵循sbt的规则,直到我最终彻底掌握了所有的概念。
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
...