複数人で開発している時、様々なデータベースを切り替える為に毎回propel.iniとdatabases.ymlを書き換えていませんか?Subversionでファイルを共有していて、プロジェクトメンバーの誰かがdatabases.ymlをcommitしてしまって喧嘩になった事はありませんか?このような事にならないよう私の会社では以下のようなconfigureタスクを利用して環境設定をできるようにしています。
今日は小ネタですがこのconfigureタスクをご紹介します。
注意:ブログエンジンのせいで–(ハイフン2つ)が一つに表記されてしまっています。回避方法が 判りませんのでコードをコピペする人は注意してください。
pakeタスクを作る
プロジェクトにpakeタスクを作成します、詳しく知りたい方は以前のエントリでプロジェクト毎のアプリケーション作成方法をおさらいしてみてください。以下のようなコードをmyproject/data/tasks/myPakeTaks.phpのファイルに書きます。
ハイフン処理がおかしいのでがコピペせずにtracから取得してください
<?php pake_desc('configure this project'); pake_task('configure', 'project_exists'); /** * symfony configure --with-dsn=mysql://root:@localhost/dbname */ function run_configure($task,$args){ $begin_token = "##"; $end_token = "##"; $ext = ".in"; $tokens = array(); foreach($args as $arg){ if(preg_match("/^--with-([^=]+)=(.*)/",$arg,$m)){ $tokens[strtoupper($m[1])] = $m[2]; } } $tokens["PWD"] = getcwd(); $tempaltes = pakeFinder::type('file') ->ignore_version_control() ->name("*.in"); foreach($tempaltes->in(".") as $file){ $replaced = false; $content = file_get_contents($file); foreach ($tokens as $key => $value){ $content = str_replace($begin_token.$key.$end_token, $value, $content, $count); if ($count) $replaced = true; } $target = substr($file,0,-3); pake_echo_action('tokens', $target); file_put_contents($target, $content); } }
設定ファイルのテンプレート
データベースを切り替えるために以下の2つのファイルを切り替える必要があります。
- myproject/config/databases.yml
- myproject/config/propel.ini
configureタスクは .inで終わるファイルを探しキーワードを置換し.inを除いたファイルへ出力します。上記2つのファイルからDSNを書いている場所を##DSN##で置換しdatabases.yml.in、propel.ini.inにそれぞれ名前を修正します。databases.ymlは例えば以下のようになります。
all:
propel:
class: sfPropelDatabase
param:
dsn: ##DSN##propel.iniのpropel.output.dir
propel.iniにはもう一つ設定を切り替えなくてはならない場所があります。propel.output.dirです、これにはsymfony init-projectした環境のパスが入っているはずです。これもconfigureで切り替えできるようにpropel.iniのpropel.output.dirを##PWD##に置き換えます。
構成管理を考える
以下のファイルは、ユーザが生成するファイルとしてSubversionの管理下から外してしまいましょう。
- myproject/config/databases.yml
- myproject/config/propel.ini
上の二つのファイルはsvnでignoreしてしまいましょう。
その代わりテンプレートである
- myproject/config/databases.yml.in
- myproject/config/propel.ini.in
をSubversion管理下に置きます。
データベースを切り替えるために毎回ファイルを2つ切り替えることは簡単な事ですが、確実にこなさなくてはなりません。この手の作業は小さなストレスを生みます。小さなストレスは知らない間に積み重なっていき、プロジェクトメンバの生産性に大きく影響していきます。本件に関わらず、つまらない事でも開発からストレスを除く努力は非常に重要だと考えます。


ついでに、config/config.phpも対象にした方がいい気が。 1.0.0から使ってるsymfonyのpath書かれるようになったし。
そうだね。 config/config.phpも対応すべきです。