階層的で継承可能な構成に最適なPerlモジュールは何ですか?
-
22-07-2019 - |
質問
グリーンフィールドプロジェクトがある場合、使用するPerlベースの構成モジュールのベストプラクティスは何ですか?
Catalystアプリといくつかのコマンドラインスクリプトがあります。同じ設定を共有する必要があります。
必要だと思う機能のいくつか...
さまざまな開発およびライブ設定をきれいに維持するための階層構成。
<!> quot; global <!> quot;を定義したい一度設定(例えばresults_per_page = <!> gt; 20)、それらは継承されますが、私のdev / live configsによってオーバーライド可能です。
Global:
results_per_page: 20
db_dsn: DBI:mysql;
db_name: my_app
Dev:
inherit_from: Global
db_user: dev
db_pass: dev
Dev_New_Feature_Branch:
inherit_from: Dev
db_name: my_app_new_feature
Live:
inherit_from: Global
db_user: live
db_pass: secure
新しいサーバーにプロジェクトを展開するとき、または新しい場所(たとえば、新しい開発インスタンス)にブランチ/フォーク/コピーするときに、使用する構成セット/ファイルを(一度だけ)設定したい今後の更新はすべて自動です。
これはシンボリックリンクで達成できると思います:
git clone example.com:/var/git/my_project . # or any equiv vcs
cd my_project/etc
ln -s live.config to_use.config
その後、今後
git pull # or any equiv vcs
また、FindBinに似たものが欲しいので、私の構成では絶対パスを使用することも、現在のデプロイメントに対する相対パスを使用することもできます。与えられた
/home/me/development/project/
bin
lib
etc/config
/ home / me / development / project / etc / configの内容:
tmpl_dir: templates/
perlコードが取得するtmpl_dir構成を検索すると、次のようになります。
/home/me/development/project/templates/
ただし、ライブ展開では:
/var/www/project/
bin
lib
etc/config
同じコードが魔法のように戻る
/var/www/project/templates/
構成内の絶対値は、次のように尊重される必要があります。
apache_config: /etc/apache2/httpd.conf
は<!> quot; /etc/apache2/httpd.conf <!> quot;を返します。すべての場合。
FindBinスタイルのアプローチではなく、構成値を他の構成値の観点から定義できるようにする方法がありますか?
tmpl_dir: $base_dir/templates
ポニーも欲しい;)
解決
Catalyst :: Plugin :: ConfigLoader は複数の設定ファイルの上書きをサポートしています。 Catalystアプリの名前がMyApp
の場合、3つのレベルのオーバーライドがあります。1)MyApp.pm
は__PACKAGE__->config(...)
ディレクティブを持つことができます、2)次にアプリのメインディレクトリでMyApp.yml
を探します、3) MyApp_local.yml
を探します。各レベルは、他の各レベルの設定をオーバーライドできます。
構築したCatalystアプリで、不変の設定をすべてMyApp_<servertype>.yml
に、デバッグ設定をln -s
に、実稼働設定を<=>に配置し、<=>を指すようにシンボリックリンク<=>しますデプロイされたサーバーごとに(それらはすべて少し異なっていました...)。
そのように、私の設定はすべてSVNにあり、サーバーを手動で設定するには1つの<=>ステップが必要でした。
他のヒント
Perlのベストプラクティスは、まさにあなたが望むものに対して警告します。構成ファイルはシンプルで、必要なバロック機能のようなものを避けるべきであると述べています。さらに3つのモジュールを推奨します(いずれもCore Perlではありません): Config ::一般、 Config :: Std 、および Config :: Tiny 。
この背後にある一般的な理由は、設定ファイルの編集は非プログラマーによって行われる傾向があり、設定ファイルを作成するのが複雑になるほど、それらが台無しになる可能性が高いことです。
それでも、 YAML をご覧になるとよいでしょう。それは、フル機能の人間が読める*
、シリアル化形式を提供します。 Perlで現在推奨されているパーサーは YAML :: XS 。この方法を使用する場合、エンドユーザーが直接ファイルを編集する代わりに使用する構成ツールを作成することをお勧めします。
ETA:Chris Dolanの回答に基づくと、Catalystは既にYAMLを使用しているので、YAMLがあなたに向いているようです(.ymlはYAMLファイルの事実上の拡張子です)。
<=>目の不自由な人は困る可能性があるという苦情を聞きました
YAMLはconfigに対して嫌いです。ポッド内のyamlが定義によって壊れているのは、両方ともさまざまな方法で空白に依存しているためです。 これは、Config :: Generalの主な問題に対処します。過去にC :: Gを使って非常に複雑な設定ファイルをいくつか書いたことがありますが、構文要件などの点では本当に邪魔になりません。それ以外は、Chrisのアドバイスは金銭的なもののようです。