2011-06-28 15 views
16

Potrzebuję sposobu na skonfigurowanie mojej aplikacji scala. Wydawało się, że Configgy jest w Scali, ale jest już przestarzałe: https://github.com/robey/configgy#readme, a teraz ta funkcjonalność jest w Struśu.Jak używać Strusia do konfiguracji?

Czy istnieje przykład kodu, w jaki sposób używać Strusz tylko do konfiguracji? Nie jestem zainteresowany gromadzeniem statystyk.

+4

napisałem zamiennik 'Configgy'. Jest kompatybilny z większością starszych plików konfiguracyjnych, plików konfiguracyjnych akka i właściwości java. Jest dostępny na https://github.com/paradigmatic/Configrity – paradigmatic

Odpowiedz

14

Chciałbym poznać oficjalną odpowiedź, ale nikt nie odpowiedział, więc postanowiłem zaglądać. Przepraszam, jeśli ta odpowiedź nie jest wyczerpująca.

Najlepszy przykład, jaki znalazłem, to com.twitter.ostrich.admin.RuntimeEnvironment, zwłaszcza jeśli patrzysz głównie na loadConfig.

Załóżmy, że chcesz skonfigurować instancję klasy T. Podstawowa idea jest następująca:

  • Get java.io.File który zawiera kod źródłowy Scala, którego wynikiem jest com.twitter.util.Config[T].
  • Aby być ważnym Config[T], musisz mieć metodę def apply(): T. Aby zachować szczegóły implementacji z pliku konfiguracyjnego, należy zdefiniować klasę w projekcie, która rozszerza się o Config[T]. Możesz także użyć tej klasy do zdefiniowania domyślnych/wymaganych pól.
  • Utwórz instancję nowej instancji com.twitter.util.Eval i wywołaj apply(file), aby uzyskać instancję Config[T].
  • Zadzwoń pod config.validate(), aby wyrzucić właściwe wyjątki dla zniekształconych plików konfiguracyjnych.
  • Zadzwoń pod config.apply(), aby uzyskać w pełni skonfigurowaną instancję T.

Oto prosty przykład, gdzie mogę skonfigurować nowy 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) 
} 

A oto mywidget_config.scala:

new WidgetConfig { 
    port = 8000 
} 

Uwaga: być może trzeba będzie dokonać zmian jeśli umieścisz ten w pakiecie. Zrobiłem wszystko w domyślnym pakiecie dla zwięzłości.

Aby uzyskać zależnościami do pracy, dodałem to do mojego SBT config:

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

wygląda bardzo skomplikowanie –

+0

Czy można zapisać wartości z powrotem do pliku scala? Ponieważ, jeśli nie jest to łatwe, wolałbym stare dobre pliki .properties. – Matroska

+0

Matroska: nie ma wbudowanej obsługi zapisywania wartości z powrotem do pliku scala, ale można napisać kod, aby zrobić to dla zwykłego przypadku (podobny w jaki sposób metoda missingValues ​​w Config może introspekować pola). Jednakże, jeśli robisz podstępne rzeczy w swojej konfiguracji, możesz stracić te informacje (przeczytałeś w "porcie = 1024 + 1", ale wypiszesz z powrotem 'port = 1025'). – Mike

Powiązane problemy