Rakeメモ - file

Makeでいうルールの定義がfileですね。

file 'hoge' => ['hoge.c', 'hoge.h'] do |task|
  sh "gcc hoge.c -o hoge"
end
  • ファイル 'hoge' が 'hoge.c', 'hoge.h' に依存していることを表す。
  • 'hoge'を生成するのに、ブロックの中のsh "..."を実行する。
    • 引数taskには、Taskクラスのインスタンスが渡される。(Taskクラスは後述)
    • shメソッドによってシェルを呼び出す。
      • FileUtilsを継承したRakeFileUtilsモジュールに定義されており、includeされている。
      • FileUtilsのメソッドと同じく{:verbose => true, :noop => true}でオプションを渡せる。
      • verboseオプションに合わせて、標準エラー出力に実行コマンドを出すなど、execやsystemよりRake向けになっている。
      • ソースを見たところMakeのSHELL変数のようにシェルを変更することはできないようだ。
    • mkdir, rm等はFileUtilsに定義されており、includeされているので、通常のシェルに近い感覚で使える。
    • ブロックは省略可能。
  • ターゲットのファイルが、依存先のファイルよりも新しければ、実行しない。

fileメソッドに{'hoge' => ['hoge.c', 'hoge.h']}なHashとブロックを渡してるだけで単なるメソッド呼び出しなのですが、Makefileと同じような構文になっていて読みやすいです。

file 'hoge' => ['hoge.c']
file 'hoge' => ['hoge.h']
  • 複数回実行した場合は、上書きではなく依存先リストに追加される。