以下があなたが探している機能を正確に提供するとは思いませんが、考える余地があるかもしれません...
アプリケーションの名前myApp
が で、-cfg <...>
コマンドライン オプションを使用して構成のソースを指定するとします。次のオプションを許可できます...
myApp -cfg /path/to/configuration/file.cfg
上記は明らかです。指定されたファイルから構成を読み取ります。
myApp -cfg "exec#curl -sS http://configWebServer/path/to/file.cfg"
プレフィックスはexec#
、指定されたコマンドを実行する必要があることを指定します。コマンドは標準出力に書き込むことが期待されます。次に、その標準出力が構成ファイルとして解析されます。
ちなみに はcat URLcurl
の略です。HTTP(S)、FTP(S)、LDAP など、さまざまなプロトコルを使用してファイルを取得できるオープンソースのユーティリティです。エラーメッセージを除いて診断を出力しないように指示するコマンドラインオプション。これはおそらくあなたが望むものです。-sS
curl
この"exec#..."
形式は、他の手段を使用して構成情報を取得する方法を提供します。たとえば、データベースにクエリを実行するスクリプトから、Subversion リポジトリから、または必要なものから。
次のバリエーションもサポートすることをお勧めします。
myApp -cfg "shared_lib=foo#..."
これにより、 という共有ライブラリがロードされ、そのfoo
中のエントリポイント関数が呼び出され、" がパラメータとして渡さ"...
れます。パラメータに基づいてどのように動作するかは、共有ライブラリ関数によって決定されます。共有ライブラリの 1 つの実装では、共有メモリからの構成情報; 別の実装では、リモート プロシージャ コールまたはソケット接続を介して取得する場合があります。
さまざまな取得メカニズムはすべて、構成データを (潜在的に大きな) 文字列として取得する役割のみを担います。たとえば、-cfg /path/to/file.cfg
メカニズムはファイルの内容全体を読み取り、それを文字列 (またはおそらく ) として返しますstd::istream
。その (潜在的に大きい) 文字列は、「実際の」構成パーサー (XML/ini/properties ファイルなどのパーサー) に渡されます。
上記の提案は、あなたの質問の半分に対する解決策を提供すると信じています。特に、任意のソースから構成データを取得するためのプラグイン アーキテクチャを提供します。プラグインは、シェル コマンドまたは共有ライブラリとして記述できます。
あなたの質問の残りの半分は、基本的に、「アプリケーションは、更新された構成データをその存続期間中に動的に取得するにはどうすればよいですか?」です。私はその要件に対処していません。部分的には、提供できるエレガントなソリューションがないためです。部分的には、構成データの再読み取りをトリガーする可能性のあるものを示していないためです。
ところで、私はConfig4*と呼ばれる C++/Java 構成パーサー ライブラリーのメンテナーです。そのライブラリは、"exec#..."
機能の実装を提供します。ソースコードを調べて、そのような機能を実装する方法を確認したい場合に備えて言及します。サポートに必要な"shared_lib=foo#..."
コードは、サポート用の既存のコードに基づいて簡単にモデル化できると思い"exec#..."
ます。「Config4* 入門ガイド」 (Web サイトから PDF および HTML 形式で入手可能) には、-cfg "exec#..."
悪意のあるコマンドの実行を防止するためのセキュリティー・メカニズムなど、機能に関する適切な説明が記載されています。