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" に修正。{}は最初にマッチした箇所だけを置換するみたい。