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
unmanagementClasspath
和fullClasspath
等其他重要关键字不是SettingsKey
,可能与委托自然堆叠在一起。它们是完整的TaskKey
,它存储了在其后面生成类路径的复杂过程。
所以,问题仍然是实际的:我如何模拟从自定义配置的Compile导出类到Test配置?还有一个密切相关的可选问题:如何对前面提到的预定义配置进行实际操作?
答案 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)
注意代表团是一种方式。更改为MyConfig
对Compile
配置没有影响。
您可以查看documentation了解详情。