[終] 使用 Scala Macro Annotation 實現配置項綁定

一個話題值得寫三篇, 可見我是多麼認(gui)真(mao)的一我的.git

續篇 相較 首篇 在定義上雖減小的噪音, 但其核心問題並無獲得完美的解決, 即:github

一旦真要對配置重構個命名什麼的, 必然是要改代碼, 再改配置segmentfault

寫了這麼些年的強類型語言, 每次陰溝裏翻船都是在 "重構配置" 以後, 這讓本是類型檢查的優點成爲了笑話.app

上一 續篇 的最後, 我留下了一個 sbt-plugin 任務待完成,.socket

在細想事後, 發現基於上個版本的實現, 還有很多細節上的難點. ui

這迫使我從 生成配置文件 的角度出發, 從新設計聲明配置的代碼風格.scala

(此處省略心裏鬥爭過程的上萬字獨白)設計

也正是所以催生了這近乎完美的第三個版本.code

Config-style

scala 靈活語法特性所賜, 代碼能夠寫很是接近最後的配置, 我把這種這寫法命名爲 config-style :server

trait kafka {
  val server = new {
    val host = "wacai.com"
    val port = 12306
  }

  val socket = new {
    val timeout = 3 seconds
    val buffer = 1024 * 64L
  }

  val client = "wacai"
}

對比一下真實的配置:

kafka {
  server {
    host = wacai.com
    port = 12306
  }

  socket {
    timeout = 3s
    buffer = 64K
  }

  client = wacai
}

基本上後者就是前者去掉關鍵字 trait, val, new 以後的內容.

難以想象嗎 ? 難以想象吧! (2333333)

對 IDE 友好

以前實現版本, 對 IDE 都不友好, 以致於我要在 README 特別註明, IDE 的錯誤提示, 其緣由是它還沒能完美支持宏特性.

如今, 不再用在爲編輯區裏哪些礙眼的紅色波浪號而揪心了.

對重構友好

在上面的風格的幫助下, 這讓配置生成的工做簡單了不少, 甚至都用不着寫 sbt-plugin , 即在編譯完成的同時生成對應的配置內容.

這意味着, 咱們終於能夠愉快地重構配置, 媽媽不再用擔憂...

默認狀況下, 會在 src/main/resources 目錄裏產生一個與 trait 同名的 .conf 文件.

爲何不直接寫入 application.conf ?

理由很簡單, 當有多個 config-style 的聲明時, 最後合併更新 application.conf 的過程會比較燒腦.

更況且有更簡單的方法, 爲何不用呢?

config 有個強大的特性, 就是支持 include "xxx.conf".

也就是說, 在 application.conf 引入全部其它生成的配置文件狀況下, 怎麼修改配置的代碼都不影響最終合併出來的內容.

更多幫助請見項目README, 另還有一個完整能夠運行的範例項目供參考.

嗯, 正文的部分已經結束, 我向毛爺爺保證這是本話題的最後一篇.

終. (碎覺)

相關文章
相關標籤/搜索