您需要将Compile 配置下的相应设置和任务设置为新定义的Mock 配置。原因是这样的:
lazy val Mock = config("mock") extend Compile
当Mock 下没有设置或任务时,sbt 会继续在Compile 中搜索,其中确实定义了run,但使用了Compile 值。
执行以下操作,它将起作用 - 请注意 Seq 中的 Classpaths.configSettings 和 run:
lazy val Mock = config("mock") extend Compile
lazy val mock = inputKey[Unit]("run in mock mode")
lazy val mockSettings = inConfig(Mock) {
Classpaths.configSettings ++
Seq(
unmanagedClasspath += baseDirectory.value / "mock-resources",
mock <<= run in Mock,
run <<= Defaults.runTask(fullClasspath in Mock, mainClass in Mock, runner in Mock)
)
}
lazy val p = (project in file("src/")).configs(Mock).settings(
mockSettings: _*
)
注意我不确定为什么需要以下行:
run <<= Defaults.runTask(fullClasspath in Mock, mainClass in Mock, runner in Mock)
我的猜测是因为run 使用默认为Compile 范围的fullClasspath,所以它看不到Mock 中的值。 sbt 让我惊叹!
我在Why does the default run task not pick settings in custom configuration?问过这个问题
示例
我一直在 src 目录下使用以下 hello.scala 运行构建:
object Hello extends App {
val r = getClass.getResource("/a.properties")
println(s"resource: $r")
}
p/mock:mock 它给了我:
> p/mock:mock
[info] Running Hello
resource: file:/Users/jacek/sandbox/mock-config/src/mock-resources/a.properties
p/mock:run 也一样:
> p/mock:run
[info] Running Hello
resource: file:/Users/jacek/sandbox/mock-config/src/mock-resources/a.properties
mock 也不例外:
> mock
[info] Running Hello
resource: file:/Users/jacek/sandbox/mock-config/src/mock-resources/a.properties