JeffreyFrancesco.org 公開日 タグ Tag Permalink 現在地 Facebook page Twitter RSS feed

こんな事書いた次のエントリで、さっそく全く関係ない話題をだすオレ。

SourceForge で開発が続けられている Blosxom ですが、version 2.1 で各種の設定を別ファイルにする (事も出来る) 機能が追加されています。「事も出来る」なので、別に今まで通り Blosxom のスクリプト内部の設定を変更しても構わないのですが、今後の色々な手間 (アップグレードとかサーバ移転だとか) の事も考えると、自分は別ファイルに分けておいた方が楽かなあと。Blosxom Starter Kit もそうなってるし (と、無理に正当化を試みる)。

で、その設定ファイルを読みに行く仕組みですが、その部分のスクリプトはこんな感じ。

# Load configuration from $ENV{BLOSXOM_CONFIG_DIR}/blosxom.conf, if it exists
my $blosxom_config;
if ( $ENV{BLOSXOM_CONFIG_FILE} && -r $ENV{BLOSXOM_CONFIG_FILE} ) {
    $blosxom_config = $ENV{BLOSXOM_CONFIG_FILE};
    ( $config_dir = $blosxom_config ) =~ s! / [^/]* $ !!x;
}
else {
    for my $blosxom_config_dir ( $ENV{BLOSXOM_CONFIG_DIR}, $datadir,
    '/etc/blosxom', '/etc' )
    {
        if ( -r "$blosxom_config_dir/blosxom.conf" ) {
            $config_dir     = $blosxom_config_dir;
            $blosxom_config = "$blosxom_config_dir/blosxom.conf";
            last;
        }
    }
}

言葉でいえば、

  1. 環境変数 BLOSXOM\_CONFIG\_FILE が設定されていればそのファイル
  2. 環境変数 BLOSXOM\_CONFIG\_DIR ディレクトリにあるファイル blosxom.conf
  3. $datadir ディレクトリにあるファイル blosxom.conf
  4. /etc/blosxom ディレクトリにあるファイル blosxom.conf
  5. /etc ディレクトリにあるファイル blosxom.conf

の順番に設定ファイルを探しに行き、見つかればそれを $blosxom\_config 変数に格納して、直後にそれを require すると。ここで面白いのは、設定ファイルを探す処理と同時に、設定ファイルが置かれるディレクトリをグローバル変数である $config\_dir に格納するところ。グローバル変数って事は、他のプラグインでも利用することが出来るって事で、例えば :

  • Blosxom 内の $datadir を、設定ファイルだけが置かれているディレクトリに (e.g. /virtual/foo/settings)
  • blosxom.conf ファイル内の $datadir は、実際にエントリが置かれるディレクトリに (e.g. /virtual/foo/entries)

こんな風にしておけば、$config\_dir は Blosxom 内の $datadir に設定された値になり、本来の $datadirblosxom.conf で設定した値で上書きされるので、環境変数を自由に設定できないレンタルサーバを利用している場合でも、設定ファイルとエントリファイルを別ディレクトリに置くことが出来ます。同時に例えば config プラグインとか使ってるなら、プラグインのスクリプトを :

my $path = $blosxom::path_info;
$path &&= "/$path";

for (;;) {
do {
  -e "$blosxom::config_dir$path/config.$blosxom::flavour"
    and eval { require "$blosxom::config_dir$path/config.$blosxom::flavour" }
    and ( $@ ? warn $@ : last );
  -e "$blosxom::config_dir$path/config"
    and eval { require "$blosxom::config_dir$path/config" }
    and ( $@ ? warn $@ : last );
} while ($path =~ s/(\/*[^\/]*)$// and $1);
last;
}

1;

こんな感じに変更すれば、config.flavour なんかも blosxom.conf と同じディレクトリに置けるので、これに flavourdir プラグインなんかも組み合わせれば、$datadirの中身がエントリファイルだけになって、非常にすっきりとするよっていう訳です。

で、ウチのディレクトリは参考までにこんな感じ。ディレクトリ名は適当。ちなみに data ディレクトリは Web アクセス出来ない位置で覗けません。Blosxom 本体も blosxom.cgi というファイル名ではないです。

/virtual - /my_dir  + /cgi-bin - blosxom.cgi
                    |
                    + /data    + /entries  - (entry files)
                    |          |
                    |          + /flavours - (flavour files)
                    |          |
                    |          + /plugins  - (plugins)
                    |          |
                    |          + /settings + blosxom.conf
                    |                      + (config files)
                    |
                    + /home    - (.htaccess, css etc.)

.htaccess は、URL から /cgi-bin/blosxom.cgi を隠すために置いてますが、それなら SetEnv BLOSXOM_CONFIG_FILE ... も一緒に書けば済むだろとか突っ込まないで下さい。大人の事情があるんです(何