2011-06-28 56 views
16

我需要一種方法來配置我的Scala應用程序。 Configgy似乎是Scala的一種選擇,但它已被棄用https://github.com/robey/configgy#readme,現在這個功能在Ostrich中。鴕鳥如何用於配置?

有沒有關於如何使用鴕鳥只用於配置的代碼示例?我對收集統計數據不感興趣。

+4

我寫了'Configgy'的替代品。它與大多數傳統配置文件,akka配置文件和java屬性兼容。它可在https://github.com/paradigmatic/Configrity – paradigmatic

回答

14

我想知道官方的答案,但沒有人回答,所以我決定捅了一圈。對不起,如果這個答案不是很全面。

我發現的最好的例子是在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" 
+3

看起來非常複雜 –

+0

是否有可能將值寫回到scala文件?因爲如果它不容易比我更喜歡舊的.properties文件 – Matroska

+0

Matroska:沒有內置的支持來將值寫回到scala文件,但可以編寫代碼來執行常見的情況(類似以及Config中的missingValues方法如何內省字段)。但是,如果你在你的配置中做了一些棘手的事情,你可能會失去這些信息(你可以在'port = 1024 + 1'中讀到,但是你會寫回'port = 1025')。 – Mike

相關問題