Разъяснение относительно делегирования области dockerExposedPorts с помощью sbt-native-packager

#scala #playframework #sbt #sbt-native-packager

Вопрос:

Я использую плагин sbt-native-packager, который поставляется с Scala Play:

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

Я хотел бы знать, почему этот dockerExposedPorts параметр не задан для root проекта при использовании:

 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, случай 1. ограничен как root / Docker / Zero / dockerExposedPorts , что должно быть более конкретным, чем случай 3. root / Zero / Zero / dockerExposedPorts . Что я здесь упускаю?

Ответ №1:

Да, Docker / dockerExposedPorts это более конкретно, чем Zero / dockerExposedPorts . Но в отличие от того, что вы, похоже, предполагаете, именно более конкретные области делегируются менее конкретным, а не наоборот. В руководстве так сказано:

Эта функция позволяет задать значение один раз в более общей области, позволяя нескольким более конкретным областям наследовать значение.

И на самом деле, это единственный способ, которым это может быть, потому что вы можете определить, например, оба Docker / dockerExposedPorts и . Universal / dockerExposedPorts Кому из них Zero / dockerExposedPorts делегировать полномочия? На это нет разумного ответа, поэтому делегирование идет в другом направлении.

Комментарии:

1. Спасибо. Поэтому, как я понимаю, мы должны отделить настройку значения в области от «поиска» значения в области. С Docker / dockerExposedPorts := Seq(9000) помощью мы устанавливаем значение в узкой конкретной области. Когда мы хотим найти значение Zero / dockerExposedPorts , оно находится в менее определенной области (без набора значений) и может делегировать/искать в еще менее определенных областях и никогда не достигнет Docker / dockerExposedPorts . Это правильно?