2011-06-28 4 views
16

Necesito una forma de configurar mi aplicación scala. Configgy parecía el camino a seguir en Scala, pero está en desuso https://github.com/robey/configgy#readme y ahora esta funcionalidad está en avestruz.¿Cómo se usa el avestruz para la configuración?

¿Hay algún ejemplo de código sobre cómo usar avestruz solo para la configuración? No estoy interesado en recopilar las estadísticas.

+4

me escribió un reemplazo para 'Configgy'. Es compatible con la mayoría de los archivos de configuración heredados, archivos de configuración akka y propiedades de Java. Está disponible en https://github.com/paradigmatic/Configrity – paradigmatic

Respuesta

14

Me gustaría saber la respuesta oficial también, pero nadie respondió, así que decidí hurgar. Lo siento si esta respuesta no es completa.

El mejor ejemplo que encontré fue en com.twitter.ostrich.admin.RuntimeEnvironment, especialmente si mira principalmente en loadConfig.

Supongamos que quiere configurar una instancia de la clase T. La idea básica es la siguiente:

  • Obtener una java.io.File que contiene el código fuente de Scala que se evalúa como un com.twitter.util.Config[T].
  • Para ser un Config[T] válido, necesitará tener un método def apply(): T. Para mantener los detalles de implementación fuera del archivo de configuración, querrá definir una clase en su proyecto que extienda Config[T]. También puede usar esta clase para definir los campos predeterminados/requeridos.
  • Crea una instancia nueva de com.twitter.util.Eval y llama al apply(file) para obtener una instancia de Config[T].
  • Llame al config.validate() para arrojar las excepciones adecuadas para los archivos de configuración mal formados.
  • Llame al config.apply() para obtener su instancia totalmente configurada de T.

Aquí está un ejemplo sencillo, en el que se configura un nuevo 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) 
} 

Y aquí es mywidget_config.scala:

new WidgetConfig { 
    port = 8000 
} 

Nota: puede que tenga que hacer modificaciones si se pone este en un paquete Hice todo en el paquete predeterminado para abreviar.

Para obtener las dependencias para trabajar, he añadido esto a mi config SBT:

libraryDependencies += "com.twitter" % "util" % "1.10.1" 
+3

se ve muy complicado –

+0

¿Es posible volver a escribir los valores en el archivo scala? Porque si no es fácil, preferiría los viejos archivos .properties buenos – Matroska

+0

Matroska: no hay soporte incorporado para escribir los valores en un archivo scala, pero es posible escribir código para hacerlo para el caso común (similar a cómo el método missingValues ​​en Config puede introspectar campos). Sin embargo, si haces cosas complicadas en tu configuración, podrías perder esa información (leerías en 'port = 1024 + 1' pero escribirías de nuevo' port = 1025'). – Mike

Cuestiones relacionadas