2016-09-28 120 views
1

我有用C++編寫的配置文件系統,它使用yaml-cpp庫來解析和寫入YAML文件。我有這個作爲我的靜態庫的一部分。如何在靜態庫中提供默認的YAML配置值?

我希望能夠爲庫的用戶請求的字段(從其代碼調用)返回默認值,但尚未在用戶的YAML文件中定義的字段的默認值。

例如說,用戶要使用該領域foo從他們的自定義config.yaml文件:

int bar = config_reader.read<int>("config.yaml", "foo"); 

如果他們在foo: 10他們config.yaml然後bar將被設置爲10。不過,我也想提供在config.yaml中省略foo的情況下的默認值(例如4)。

有我想到了兩種可能性:

  1. 有一組在CPP文件中的字段名稱和默認值之間的靜態映射,其被編譯成靜態庫的,但是我需要有不同類型的地圖不同,我覺得這可能會讓類型檢查變得混亂,也許需要模板專門化方法。

  2. 有一個YAML文件,其中包含預期字段的所有默認值,如果配置系統無法在用戶的配置文件中找到該字段,則該配置系統將返回該默認值。我認爲這對我來說是首選的解決方案,但我想不出打包這個YAML文件的方式。我寧願用戶在每次建立鏈接靜態庫的新項目時都不必複製或指向此文件。

+1

操作系統與操作系統無關?如果在Linux上將缺省設置放在'/ etc/default/YOURLIBNAME.yaml'中,並用'$ XDG_CONFIG_HOME/YOURLIBNAME/config.yaml'中的值覆蓋或者(如果XDG_CONFIG_HOME沒有設置,則$ HOME/YOURLIBNAME/config.yaml') 。如果有一些從全局配置文件中刪除了'foo'字段,我只會報錯。如果在Windows上可能應該使用'%APPDATA%' – Anthon

+0

是的,它適用於LInux系統。 這使得很多感覺和似乎很容易實施。謝謝! –

+1

如果XDG_CONFIG_HOME沒有設置,則應該是'$ HOME/.config/YOURLIBNAME/config.yaml'(我忘了'.config')。我可以讓這個答案嗎? – Anthon

回答

1

我會在全局(即非用戶特定的地方)提供YAML文件中的默認值,並允許覆蓋用戶特定值的值。 如果全局默認值缺少一個條目,請考慮引發錯誤,這不會偶然發生。

全局默認值可以輸入/etc/default/YOUBLIBNAME.yaml。現在用戶的配置大多遵循XDG基本目錄規範。如果XDG_CONFIG_HOME在環境中設置,則使用$XDG_CONFIG_HOME/YOURLIBNAME/config.yaml,如果未設置則使用$HOME/.config/YOURLIBNAME/config.yaml

如果您的圖書館必須在Windows下工作,我會將%APPDATA%下的用戶特定數據放在子目錄YOURBLINAME中。