2016-09-28 3 views
1

yaml-cppライブラリを使ってYAMLファイルを解析して書き込む、C++で書かれた構成ファイルシステムがあります。私は静的ライブラリの一部としてこれを持っています。静的ライブラリにデフォルトのYAML設定値をどのように提供しますか?

私は、ライブラリのユーザから要求された(コードから呼び出す)フィールドのデフォルト値を返すことができますが、ユーザのYAMLファイルでは定義されていません。彼らはconfig.yamlfoo: 10を持っている場合は、barは私も提供したいと思いますが10に設定されます

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

:たとえば

は、ユーザーが自分のカスタムconfig.yamlファイルからフィールドfooを使用したいと言いますfooconfig.yamlから省略された場合のデフォルト値(たとえば4)。

私が考えている二つの可能性があります。

  1. は、静的ライブラリにコンパイルされるのcppファイル内のフィールド名とデフォルト値の間の静的マップのセットを持っている、しかし、私が持っている必要がありますさまざまなタイプのマップが違っていて、タイプチェックやテンプレートの特殊化メソッドが必要になることがあります。

  2. 予想されるフィールドのデフォルト値のすべてを含むYAMLファイルがあります。このファイルは、ユーザーの設定ファイルでフィールドが見つからない場合、設定システムが元に戻ります。私はこれが私にとっては好ましい解決策だと思いますが、このYAMLファイルを綺麗にパッケージ化する方法は考えられません。むしろ、静的ライブラリをリンクする新しいプロジェクトを設定するたびに、このファイルをコピーまたはポイントする必要はありませんでした。

+1

このOSは独立していますか? 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環境で動作する必要がある場合は、サブディレクトリYOURBLINAMEにユーザ固有のデータを%APPDATA%とします。

関連する問題