在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
到底是什么?
答案 0 :(得分:4)
免责声明我对sbt的config
概念有了基本的了解。
tl; dr 扩展配置只是为了继承依赖项组而不是设置。
来自final case class Configuration的来源:
def extend(configs: Configuration*) = Configuration(name, description, isPublic, configs.toList ::: extendsConfigs, transitive)
默认情况下,extendsConfigs
为Nil
,可以在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
概念理解为依赖关系组,并Compile
中Runtime
中的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
...