Rakeのruleの使い方、pathmapの使い方について。

ソースの拡張子を変えて出力する例。CSVファイルからSQLファイルを出力する。

require 'csv'

SRC = FileList["*.csv"]
SQL = SRC.ext('sql') # 拡張子を変えたFileListを生成。

task :default => SQL

rule ".sql" => ".csv" do |t| # ruleでタスクの自動生成。xxx.sqlファイルのソースはxxx.csvである。
  #ここで何かする。
  p t.name
  p t.source
end

これは簡単。extで拡張子を変えたFileListを生成し、ruleで拡張子sqlのファイル用タスクを自動生成する。



次に、ファイル名の末尾を変えて出力する例。*.csvから*_test.sqlを出力する。

require 'csv'

SRC = FileList["*.csv"]
TEST_SQL = SRC.pathmap('%X_test.sql') # .csv -> _test.sql

task :default => TEST_SQL

rule "_test.sql" => "%{_test$,}X.csv" do |t| # _test.sql -> .csv
  #ここで何かする。
  p t.name
  p t.source
end

pathmapでソースファイル名の末尾を書き換えている。また、逆の書き換えがruleでも必要になる。

# %Xは拡張子を除いたパス全体。{}の中で置換を行う。
rule "_test.sql" => "%{_test$,}X.csv"

これが中々わからなかった。以下のようにしてもうまくいかない。

# ダメな例
rule "_test.sql" => ".csv"

このruleは、ソース*_test.csvを探しに行ってしまう。*_test.csvが存在しない場合、*_test.sqlを生成するタスクが無いというエラーがでる。

pathmapの記法は以下を参照。

Rake ユーザガイド

参考

(追記 2008-06-26) "%{_test,}X.csv" を "%{_test$,}X.csv" に修正。{}は最初にマッチした箇所だけを置換するみたい。