一個話題值得寫三篇, 可見我是多麼認(gui)真(mao)的一我的.git
續篇 相較 首篇 在定義上雖減小的噪音, 但其核心問題並無獲得完美的解決, 即:github
一旦真要對配置重構個命名什麼的, 必然是要改代碼, 再改配置segmentfault
寫了這麼些年的強類型語言, 每次陰溝裏翻船都是在 "重構配置" 以後, 這讓本是類型檢查的優點成爲了笑話.app
上一 續篇 的最後, 我留下了一個 sbt-plugin
任務待完成,.socket
在細想事後, 發現基於上個版本的實現, 還有很多細節上的難點. ui
這迫使我從 生成配置文件 的角度出發, 從新設計聲明配置的代碼風格.scala
(此處省略心裏鬥爭過程的上萬字獨白)設計
也正是所以催生了這近乎完美的第三個版本.code
拜 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 都不友好, 以致於我要在 README
特別註明, IDE 的錯誤提示, 其緣由是它還沒能完美支持宏特性.
如今, 不再用在爲編輯區裏哪些礙眼的紅色波浪號而揪心了.
在上面的風格的幫助下, 這讓配置生成的工做簡單了不少, 甚至都用不着寫 sbt-plugin
, 即在編譯完成的同時生成對應的配置內容.
這意味着, 咱們終於能夠愉快地重構配置, 媽媽不再用擔憂...
默認狀況下, 會在 src/main/resources
目錄裏產生一個與 trait
同名的 .conf
文件.
爲何不直接寫入 application.conf
?
理由很簡單, 當有多個 config-style
的聲明時, 最後合併更新 application.conf
的過程會比較燒腦.
更況且有更簡單的方法, 爲何不用呢?
config 有個強大的特性, 就是支持 include "xxx.conf"
.
也就是說, 在 application.conf
引入全部其它生成的配置文件狀況下, 怎麼修改配置的代碼都不影響最終合併出來的內容.
更多幫助請見項目README, 另還有一個完整能夠運行的範例項目供參考.
嗯, 正文的部分已經結束, 我向毛爺爺保證這是本話題的最後一篇.
終. (碎覺)