設定ファイル config.cf
MLごとの設定ファイル config.cf
各MLごとにさまざまなカスタマイズをすることができます。
この点は &fml4; でも &fmldevel; でも同様です。
そのために &fml4; では
各MLのホームディレクトリ $DIR に config.ph というファイルがあります。
これは .ph という名前でわかる通り perl script です。
&fmldevel; では config.cf 一つです。
フォーマットは postfix や .ini 風の
変数 = 値
&fml4; の諸問題
&fml4; の perl script 方式にはいくつか問題があります。
例えば perl script なので、perl が許す限りの自由な書き方ができます。
これは人間にとっては嬉しいのですが、
機械処理の観点からは問題です。というのは
makefml や CGI をはじめとする設定インターフェイスを書きにくいのです。
そこで &fml4; では、
cf というファイルと config.ph という
2 つのフォーマットの異なるファイルが使われています。
しかし、これはこれで2つのファイルに分かれてしまう点が
保守しにくさを生みます。
よって &fmldevel; では、
設定インターフェイスにやさしい新フォーマットを提唱します。
それが config.cf です。
これは本質的に postfix 風のフォーマットです。
config.cf のフォーマット
config.cf のフォーマットは
/etc/fml/main.cf
と同様です。
変数名 = 値
変数名 = 値1 値2 値3
変数名 = 値1
値2
値3
のようにスペースないしは改行で区切って複数の値を書くことができます。
変数定義内での $ による変数の展開も可能です。
例えば
a = 値1
b = $a/値2
は最終的に
a = 値1
b = 値1/値2
と解釈されます。
展開は、すべての変数定義を読み込んだ後に行なわれます。
そのため、以下のような定義をすると
a = 値1
b = $a/値2/$c
c = 値3
a = 値4
次のように
b = 値4/値2/値3
と解釈されます。
postfix style のさらなる拡張
変数名 += 値
変数名 -= 値
で、特定の値の足し引きができます。
x = a b c d
x -= b
は
x = a c d
などとなる。
また
x = a b c d
x += e
は
x = a b c d e
などとなる。
config.cf の多重読み込み(変数定義の上書き)
複数の config.cf を読み込み、定義の上書きを行なうことができます。
これを利用して
『デフォルトの定義』、
『サイト固有の定義』、
『ドメイン固有の定義』
などを別のファイルに分離することができます。
デフォルトではいくつかの .cf ファイルに分離されています。
fml は起動時にそれらのファイルを順番に読みこみ、
最後にML固有の config.cf を読み込みます。
そして、その後に変数の展開処理を行ないます。
展開後に変数を代入すると?
$ をふくむ変数の値の代入が行なわれると、
次に値を取り出すメソッド
perl の tie 操作
が呼ばれた際に、変数の再展開が行なわれます。
例えば
$config->{ key } = '$ml_home_dir/value';
という代入処理が行なわれると、次に
$config->{ another_key }
(キーはなんでもよい)メソッドが呼ばれた際に再評価されることになります。
内部構造: 変数展開
内部構造の話をすると、
まず %_fml_config に キーと値 の組が保存されます。
これは $dir/$file のような形式のままです。
get() はこのハッシュではなく %_fml_config_result の値を返しています。
このハッシュ中の値は $dir などが展開された後の値で、
/var/spool/ml/elena/file などとなっています。
この変数の値の展開は get() なりで呼ばれた時に始めて行なわれます。
変数一覧 (alphabetical order)
&table.list.variables;