Как страус используется для конфигурации? - PullRequest
16 голосов
/ 28 июня 2011

Мне нужен способ настроить мое приложение Scala.Конфигурация казалась подходом для Scala, но устарела https://github.com/robey/configgy#readme, и теперь эта функциональность доступна в Страусе.

Есть ли пример кода о том, как использовать Ostrich только для конфигурации?Я не заинтересован в сборе статистики.

1 Ответ

14 голосов
/ 14 июля 2011

Мне бы тоже хотелось узнать официальный ответ, но никто не ответил, поэтому я решил побродить.Извините, если этот ответ не является исчерпывающим.

Лучший пример, который я нашел, был в com.twitter.ostrich.admin.RuntimeEnvironment, особенно если вы смотрите в основном на loadConfig.

СкажитеВы хотите настроить экземпляр класса T.Основная идея заключается в следующем:

  • Получите java.io.File, который содержит исходный код Scala, который оценивается как com.twitter.util.Config[T].
  • Чтобы быть действительным Config[T], вам нужно иметь def apply(): T метод.Чтобы сохранить детали реализации вне конфигурационного файла, вам нужно определить класс в вашем проекте, который расширяет Config[T].Вы также можете использовать этот класс для определения полей по умолчанию / обязательных для заполнения.
  • Создание нового экземпляра com.twitter.util.Eval и вызов apply(file) для получения экземпляра Config[T].
  • Позвоните config.validate(), чтобы выдать правильные исключения для искаженных файлов конфигурации.
  • Позвоните config.apply(), чтобы получить полностью настроенный экземпляр T.

Вот простойНапример, где я настраиваю новый WidgetService:

class WidgetService(val port: Int)

class WidgetConfig extends com.twitter.util.Config[WidgetService] {
  var port = required[Int]
  def apply(): WidgetService = {
    new WidgetService(port)
  }
}

object MyApp extends App {
  val configFile = new java.io.File("mywidget_config.scala")
  val eval = new com.twitter.util.Eval
  val config = eval[com.twitter.util.Config[WidgetService]](configFile)
  config.validate()
  val widgetService = config()
  println(widgetService.port)
}

А вот mywidget_config.scala:

new WidgetConfig {
  port = 8000
}

Примечание: возможно, вам придется внести изменения, если вы поместите это впакет.Я сделал все в пакете по умолчанию для краткости.

Чтобы заставить работать зависимости, я добавил это в свою конфигурацию SBT:

libraryDependencies += "com.twitter" % "util" % "1.10.1"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...