使用 sbt-native-packager 澄清 dockerExposedPorts 的范围委托

Clarification on scope delegation of dockerExposedPorts with sbt-native-packager

我正在使用 Scala Play 自带的 sbt-native-packager 插件:

addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.8.8")

我想知道为什么 root 项目在使用时没有设置 dockerExposedPorts 设置:

name := """scala-play-react-seed"""
version := "1.0-SNAPSHOT"

lazy val root = (project in file("."))
  .enablePlugins(PlayScala)
  .settings(
    Docker / dockerExposedPorts := Seq(9000), // <-- 1. doesn't work
  )

Docker / dockerExposedPorts := Seq(9000), // <-- 2. also doesn't work
$ sbt show root/dockerExposedPorts
[info] * 

但是,如果我删除 Docker 配置部分,它会起作用:

  .settings(
    dockerExposedPorts := Seq(9000), // <-- 3. works
  )
$ sbt show root/dockerExposedPorts
[info] * 9000

据我了解 sbt 的 scope delegation,案例 1. 的范围为 root / Docker / Zero / dockerExposedPorts,这应该比案例 3. root / Zero / Zero / dockerExposedPorts 更具体。我在这里错过了什么?

是的,Docker / dockerExposedPortsZero / dockerExposedPorts 更具体。但与您似乎假设的不同,它是更具体的范围委托给不太具体的范围,而不是相反。手册是这样说的:

This feature allows you to set a value once in a more general scope, allowing multiple more-specific scopes to inherit the value.

事实上,这是唯一可能的方式,因为您可以定义 e。 G。 Docker / dockerExposedPortsUniversal / dockerExposedPortsZero / dockerExposedPorts 会委派给其中哪一个?对此没有合理的答案,因此授权朝另一个方向发展。