使一个sbt配置依赖于另一个

时间:2014-05-10 21:21:01

标签: scala sbt

sbt文档显示了如何仅在项目之间声明依赖关系的示例。但我很肯定有一些方法可以声明一个配置依赖于另一个配置,就像测试配置使用Compile配置中的类路径一样。

如何声明我自己的配置,以便它依赖于编译配置生成的类路径?


我更仔细地看一下建议的解决方案,然后再出现一堆问题。所以我重新打开了这个问题

我无法仅从Test和Compile config之间的委托关系推断出sbt行为。

尽管被委派了,但源目录对于Test和Compile配置来说完全不同。

> show test:unmanagedSourceDirectories
[info] List(./src/test/scala, ./src/test/java)
> show test:scalaSource
[info] ./src/test/scala
> show test:javaSource
[info] ./src/test/java
> show compile:unmanagedSourceDirectories
[info] List(./src/main/scala, ./src/main/java)
> show compile:scalaSource
[info] ./src/main/scala
> show compile:javaSource
[info] ./src/main/java

unmanagementClasspathfullClasspath等其他重要关键字不是SettingsKey,可能与委托自然堆叠在一起。它们是完整的TaskKey,它存储了在其后面生成类路径的复杂过程。

所以,问题仍然是实际的:我如何模拟从自定义配置的Compile导出类到Test配置?还有一个密切相关的可选问题:如何对前面提到的预定义配置进行实际操作?

1 个答案:

答案 0 :(得分:3)

您可以将一个配置扩展为另一个配置。您可以使用extend方法执行此操作。

lazy val MyConfig = config("myConfig") extend(Compile)

lazy val root = project.in(file(".")).
    configs(MyConfig).
    settings(inConfig(MyConfig)(Defaults.compileSettings ++ Defaults.compileInputsSettings): _*)

在这种情况下,对于Compile配置中未定义的设置,Extend将委托给MyConfig

您可以通过运行SBT并执行例如show myConfig:managedClasspath来检查它,输出应与show compile:managedClasspath完全相同。

如果您检查新配置managedClasspath,则会发现它已委托给compile

[info] Delegates:
[info]  myConfig:managedClasspath
[info]  compile:managedClasspath
[info]  *:managedClasspath
[info]  {.}/myConfig:managedClasspath
[info]  {.}/compile:managedClasspath
[info]  {.}/*:managedClasspath
[info]  */myConfig:managedClasspath
[info]  */compile:managedClasspath
[info]  */*:managedClasspath

正如我上面所述,如果在给定配置中未定义SBT,SBT将仅委托给该设置。

例如,如果您没有为myConfig定义任何特定的编译器选项,则会从compile获取设置。

> show compile:scalacOptions
[info] List()
> show myConfig:scalacOptions
[info] List()

更改compile配置中的设置会对myConfig

产生影响
> set scalacOptions in Compile += "-Xexperimental"
> show compile:scalacOptions
[info] List(-Xexperimental)
> show myConfig:scalacOptions
[info] List(-Xexperimental)

覆盖myConfig中的设置将使SBT使用该配置中定义的设置,而Compile将拥有自己的值:

> set scalacOptions in MyConfig  := Seq("-Xcheck-null")
> show compile:scalacOptions
[info] List(-Xexperimental)
> show myConfig:scalacOptions
[info] List(-Xcheck-null)

注意代表团是一种方式。更改为MyConfigCompile配置没有影响。

您可以查看documentation了解详情。