railsコマンドのデータベース指定

(/3/17追記。「Rails勉強会@東京第28回ライトニングトーク」にてここの内容発表しました。当日の様子と発表の準備については「Rails勉強会 出席」にて)

railsコマンドで最初に Railsアプリケーションを作る際、デフォルトじゃないDBシステムを指定するにはコマンドラインオプションに「--database=postgresql」(または -d postgresql)と書く訳だ。しかし、毎回書いてるのはなんか面倒臭い、というか忘れる、DRYじゃない。
環境変数なんかで指定しておけないかとさがすけど出てこない。AWDwR見てもさっきのオプションのことしか出てないみたい。いろいろ検索しても探せない。

Windowsでの railsコマンドの起動

というわけで railsコマンドの起動を追いかけてみる。
Windowsです、XP。

  1. C:\Program Files\ruby-1.8\bin\rails.bat
    1. WinNT(系)かどうかの識別
    2. そうだったら「"%~dp0ruby.exe" "%~dpn0" %*」
      • dpn0 とかは Windowsの Cmd.exe バッチ パラメータ参照。
        • 「%~dp0」は%0(バッチファイル名)のドライブ文字パス名
        • 「%~dpn0」は%0(バッチファイル名)のドライブ文字パス名バッチファイル名
        • 「%*」はその引数の全て
        • ちなみに、%0 はコマンドラインrails.bat と呼ばれてたら rails.bat、rails なら rails となる。
        • 一方ここで使ってる %~n0 はどちらの場合でも拡張子なしのファイル名。そして拡張子は %~x0 (/3/16追記)
    3. というわけで、rails.bat と同じディレクトリの railsファイルを ruby.exe で起動する
  2. C:\Program Files\ruby-1.8\bin\rails
    1. rubygems を呼んで、さらにバージョンチェックとか、ちょっと
      1. バージョン関係で場合によっては ARGV.shift 一回
    2. load 'rails'
    3. というわけでロードパスで railsを探す
      • 探索順序をちゃんと追ったわけじゃないけど、まあ、gems の rails だよな
  3. C:\Program Files\ruby-1.8\lib\ruby\gems\1.8\gems\rails-2.0.2\bin\rails
    1. バージョンチェックとかちょっと
    2. 第一引数が versionぽかったらヴァージョン表示して終了
    3. freeze かどうかのチェックをして、第一引数を app_path にセット、別に引数を shift したりはしない
    4. generator系を requireしたりちょっと準備
    5. Rails::Generator::Scripts::Generate.new.run(ARGV, :generator => 'app')
      • ARGV をそのまま渡してる、環境変数見に行ったりとか全然無い
      • ジェネレーターの中身はちゃんと見てないけど、引数になってる配列(とハッシュ)を素直にみてるわけで、別に環境変数見に行ってるような感じはない。
    6. freeze系の処理ちょっと

というわけで、railsコマンドのオプションを予め環境変数に設定しておくというような仕組みは無いようだ。

データベースオプションを書いておく

というわけで、上記起動機序のどこかにデータベースオプションを紛れ込ませよう。
注意するのは、第一引数が上で見てきたように特別扱いになっているということ、所要のデータベースオプションが第一引数の邪魔をしないようにする。
まあ、rails.bat だよね。上でも引用してる 6行目を次のように書き換える。一応95系のところも同様に。

"%~dp0ruby.exe" "%~dpn0" %* --database=postgresql

なってる。