Подтвердить что ты не робот

Как Страус используется для настройки?

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

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

4b9b3361

Ответ 1

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

Лучший пример, который я нашел, был в 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"