Ruby 1.9.2 リファレンスマニュアル > ライブラリ一覧 > library rake
library rake
要約
Rake というコマンドラインツールを扱うライブラリです。
Rake とは
Rake は Make によく似た機能を持つ Ruby で書かれたシンプルなビルドツールです。
Rake は以下のような特徴を持っています。
- Rakefile (Rake における Makefile) は標準的な Ruby の文法で書くことができます。 XML ファイルを編集する必要はありませんし、Makefile の風変わりな文法 (タブだっけ?スペースだっけ?) に頭を悩ませる必要もありません。
- ユーザは必須条件をタスクに指定できます。
- Rake は暗黙のタスクを合成することをサポートしています。
- 配列のように振る舞うフレキシブルな FileList メソッドがあります。 FileList はファイル名やパス名を扱うのに便利です。
- Rakefile をより簡単に作成するためにこのライブラリにはいくつかのタスクが同梱されています。
@see make(1)
Rake コマンドの使い方
$ rake --help rake [-f rakefile] {options} targets... Options are ... -C, --classic-namespace トップレベルに Task, FileTask を定義します。 過去との互換性のためのオプションです。 -D, --describe [PATTERN] パターンにマッチしたタスクの詳細を表示して終了します。 パターンは省略可能です。 -n, --dry-run アクションを実行せずにタスクを実行します。 -e, --execute CODE Ruby のコードを実行して終了します。 -p, --execute-print CODE Ruby のコードを実行して結果を表示して終了します。 -E, --execute-continue CODE Ruby のコードを実行してから、タスクを実行します。 -I, --libdir LIBDIR ロードパスに LIBDIR を含めます。 -P, --prereqs タスクの依存関係を表示して終了します。 -q, --quiet 標準出力にログメッセージを表示しません。 -f, --rakefile [FILE] FILE を Rakefile として使用します。 -R, --rakelibdir RAKELIBDIR RAKELIBDIR にある *.rake ファイルを自動的にインポートします。 --rakelib デフォルトは rakelib です。 -r, --require MODULE Rakefile を実行する前に MODULE を require します。 --rules ルールの解決を追跡します。 -N, --no-search, --nosearch 親ディレクトリの Rakefile を検索しません。 -s, --silent --quiet に似ていますが、ディレクトリも表示しません。 -g, --system システム全体の Rakefile を使用します。('~/.rake/*.rake') -G, --no-system, --nosystem システム全体の Rakefile を使用しません。 -T, --tasks [PATTERN] パターンにマッチしたタスクの短い説明を表示して終了します。 パターンは省略可能です。 -t, --trace 全てのバックトレースを表示します。 -v, --verbose 標準出力にログメッセージを表示します (デフォルト)。 -V, --version このプログラムのバージョンを表示します。 -h, -H, --help このメッセージを表示します。
Rake ファイルの書き方
一から全て自分で書くことも出来ますが、あらかじめ定義されているタスクを 使用すると比較的複雑なタスクも簡単に定義することができます。 また、ルールやファイルタスクをうまく使うとタスクを簡潔に書くことが 出来る場合があります。Rakefile は普通の Ruby スクリプトと同じ文法で 書くことができるので工夫次第で Ruby にできることなら何でもできます。
簡単な例:
# coding: utf-8 task :hello do puts 'do task hello!' end
動的にタスクを定義する例:
# cofing: utf-8 require 'rake/testtask' require 'rake/clean' # clean, clobber の二つのタスクを定義 task :default => [:test] 1.upto(8) do |n| Rake::TestTask.new("test_step#{n}") do |t| t.libs << "step#{n}" t.test_files = FileList["step#{n}/test_*.rb"] t.verbose = false end end desc 'execute all test' task 'test_all' => (1..8).to_a.map{|n| "test_step#{n}"}
用語集
- action / アクション
-
タスクを機能させるためのコードです。 Rakefile 内のアクションはコードブロックで指定されます。(たいていは do/end ブロックで区切られます)
- execute / 実行
-
あるタスクが実行されると、それに含まれるアクションは定義された順番通りに全て評価されます。 invoke と違うのは execute はアクションを常に実行する点です (事前タスクを呼び出したり実行したりしません)。
- file task (FileTask) / ファイルタスク (FileTask)
-
ファイルとはファイルを作成するためのものです。(同じ名前のタスクもあります) ファイルタスクは呼び出されると以下の条件のいずれかを満たす場合のみタスクを実行します。 (1) 関連するファイルが存在しない場合 (2) 事前タスクで作成したファイルの方が新しい場合 普通のタスクを事前タスクに持つファイルタスクが常に実行されるのは、 普通のタスクが現在時刻をタイムスタンプとしているためです。
- invoke / 呼び出し
-
あるタスクが呼び出されると、最初にそのタスクが以前呼び出されたことがあるかチェックします。 呼び出されたことがあれば何もしません。そのタスクが初めて呼び出された場合は、そのタスクの 事前タスクを一つずつ呼び出します。最終的に、このタスクのアクションを実行する必要があるかどうか チェックします。このタスクを実行する必要があれば、アクションを実行します。 NOTE: このタスクを実行する必要が無い場合も事前タスクは呼び出されています。この振る舞いは将来変更予定です。
- prerequisites / 事前タスク
-
全てのタスクはゼロ個以上の事前タスクを持ちます。 タスク T に対する事前タスク P は必ずタスク T よりも前に呼び出されます。
- rule / ルール
-
タスクが明確に定義されていない場合に、ルールはタスクを合成するレシピになります。 ルールはふつうファイルタスクを合成します。
- task (Task) / タスク (Task)
-
Rake ファイルにおける基本単位です。 タスクは名前と、事前タスクと、実行するアクションのリストを持ちます。
クラスとモジュール
module Rake | Rake の主要なモジュールです。 |
class Rake::Application | Rake で使用するメインのクラスです。 |
module Rake::Cloneable | 簡単に複製したオブジェクトを作成することができるようにするための Mixin モジュールです。 |
class Rake::DefaultLoader | Kernel#import で使用するデフォルトのローダーです。 |
class Rake::EarlyTime | このクラスは全てのタイムスタンプより前の時刻をあらわします。 |
class Rake::FileCreationTask | このタスクはファイルが存在しない場合にファイルを作成するタスクです。 |
class Rake::FileList | このクラスは Array と基本的には同じです。 |
class Rake::FileTask | ファイルタスクは時間に基づいた依存関係を解決することができるタスクです。 |
class Rake::InvocationChain | 循環したタスクの呼び出しを検出するためのクラスです。 |
class Rake::InvocationChain::EmptyInvocationChain | 呼び出し関係のトップレベルを表します。 |
class Rake::MultiTask | 通常のタスクと同じですが、thread を用いて事前タスクを並列実行します。 |
class Rake::NameSpace | タスクの名前空間を表すクラスです。 |
class Rake::Task | タスクは Rakefile における基本単位です。 |
class Rake::TaskArguments | タスクに渡されるパラメータの管理をするクラスです。 |
module Rake::TaskManager | タスクを管理するためのモジュールです。 |
module RakeFileUtils | カスタムバージョンの FileUtils のメソッドを提供します。 |
例外クラス
class Rake::RuleRecursionOverflowError | ルールのネストが多すぎる場合に発生する例外です。 |
class Rake::TaskArgumentError | 間違ったタスクの定義を行った場合に発生する例外です。 |
サブライブラリ
rake/classic_namespace | このライブラリは古い Rakefile を使用する場合のみ使用してください。 |
rake/clean | このライブラリは Rake タスクを定義しています。 |
rake/gempackagetask | Gem Spec ファイルを元にして Gem パッケージを作成するタスクを定義するためのライブラリです。 |
rake/loaders/makefile | Makefile をロードするためのライブラリです。 |
rake/packagetask | 配布するパッケージ (zip, tar, etc...) を作成するためのタスクを定義します。 |
rake/rake_test_loader | このライブラリを require すると、 コマンドラインからテスト対象のファイルをロードします。 |
rake/rdoctask | ドキュメントを作成するためのタスクを定義します。 |
rake/runtest | |
rake/tasklib | タスクのライブラリを作成するためのベースとなるクラスを扱うライブラリです。 |
rake/testtask | ユニットテストを実行するためのタスクを定義するライブラリです。 |
追加・再定義されるメソッド
FileUtils#ruby(*args) { ... }
[added by rake]-
与えられた引数で Ruby インタプリタを実行します。
- [PARAM] args:
- Ruby インタプリタに与える引数を指定します。
例:
ruby %{-pe '$_.upcase!' <README}
FileUtils#safe_ln(*args)
[added by rake]-
安全にリンクを作成します。
リンクの作成に失敗した場合はファイルをコピーします。
- [PARAM] args:
- FileUtils.#cp, FileUtils.#ln に渡す引数を指定します。
[SEE_ALSO] FileUtils.#cp, FileUtils.#ln
FileUtils#sh(*cmd) {|result, status| ... }
[added by rake]-
与えられたコマンドを実行します。
与えられた引数が複数の場合、シェルを経由しないでコマンドを実行します。
- [PARAM] cmd:
- 引数の解釈に関しては Kernel.#exec を参照してください。
例:
sh %{ls -ltr} sh 'ls', 'file with spaces' # check exit status after command runs sh %{grep pattern file} do |ok, res| if ! ok puts "pattern not found (status = #{res.exitstatus})" end end
[SEE_ALSO] Kernel.#exec, Kernel.#system
FileUtils#split_all(path) -> Array
[added by rake]-
与えられたパスをディレクトリごとに分割します。
- [PARAM] path:
- 分割するパスを指定します。
例:
split_all("a/b/c") => ['a', 'b', 'c']
Kernel#desc(description)
[added by rake]-
直後の Rake タスクの説明を登録します。
- [PARAM] description:
- 直後のタスクの説明を指定します。
例:
desc "Run the Unit Tests" task :test => [:build] runtests end
Kernel#directory(dir)
[added by rake]-
与えられたディレクトリを作成するタスクを定義します。
- [PARAM] dir:
- 作成するディレクトリを指定します。
例:
directory 'testdata/doc'
Kernel#file(*args) { ... } -> Rake::FileTask
[added by rake]-
ファイルタスクを定義します。
- [PARAM] args:
- ファイル名と依存ファイル名を指定します。
例:
file "config.cfg" => ["config.template"] do open("config.cfg", "w") do |outfile| open("config.template") do |infile| while line = infile.gets outfile.puts line end end end end
[SEE_ALSO] Rake::Task.define_task
Kernel#file_create(*args) { ... } -> Rake::FileCreationTask
[added by rake]-
ファイルを作成するタスクを定義します。
主に Kernel.#directory を定義するために使用します。
Kernel#import(*filenames)
[added by rake]-
分割された Rakefile をインポートします。
インポートされたファイルは、現在のファイルが完全にロードされた後でロードされます。 このメソッドはインポートするファイルのどこで呼び出されてもかまいません。 また、インポートされるファイル内に現れるオブジェクトはインポートするファイル内で定義 されているオブジェクトに依存していてもかまいません。
このメソッドは依存関係を定義したファイルを読み込むのによく使われます。
- [PARAM] filenames:
- インポートする Rakefile を指定します。
例:
import ".depend", "my_rules"
Kernel#multitask(args) { ... } -> Rake::MultiTask
[added by rake]-
事前タスクを並列実行するタスクを定義します。
与えられた事前タスクを実行する順序は不定です。
例:
multitask :deploy => [:deploy_gem, :deploy_rdoc]
Kernel#namespace(name = nil) { ... } -> Rake::NameSpace
[added by rake]-
新しい名前空間を作成します。
与えられたブロックを評価する間は、その名前空間を使用します。
例:
ns = namespace "nested" do task :run end task_run = ns[:run] # find :run in the given namespace.
[SEE_ALSO] Rake::TaskManager#in_namespace
Kernel#rule(*args) {|t| ... }
[added by rake]-
自動的に作成するタスクのためのルールを定義します。
- [PARAM] args:
- ルールに与えるパラメータを指定します。
例:
rule '.o' => '.c' do |t| sh %{cc -o #{t.name} #{t.source}} end
Kernel#task(*args) { ... } -> Rake::Task
[added by rake]-
Rake タスクを定義します。
- [PARAM] args:
- タスク名と依存タスクを指定します。
例:
task :clobber => [:clean] do rm_rf "html" end
[SEE_ALSO] Rake::Task.define_task
Module#rake_extension(method) { ... }
[added by rake]-
与えられたブロック内で既に存在するメソッドを再定義しようとした場合に 警告を表示します。この場合、ブロックは評価されません。
- [PARAM] method:
- ブロック内で再定義する予定のメソッド名を指定します。
例:
class String rake_extension("xyz") do def xyz ... end end end
String#ext(newext = '') -> String
[added by rake]-
自身の拡張子を与えられた拡張子で置き換えます。
自身に拡張子が無い場合は、与えられた拡張子を追加します。 与えられた拡張子が空文字列の場合は、自身の拡張子を削除します。
- [PARAM] newext:
- 新しい拡張子を指定します。
String#pathmap(spec = nil) { ... }
[added by rake]-
与えられた書式指定文字列に応じてパス(自身)を変換します。
与えられた書式指定文字列は変換の詳細を制御します。 指定できる書式指定文字列は以下の通りです。
- %p
-
完全なパスを表します。
- %f
-
拡張子付きのファイル名を表します。ディレクトリ名は含まれません。
- %n
-
拡張子なしのファイル名を表します。
- %d
-
パスに含まれるディレクトリのリストを表します。
- %x
-
パスに含まれるファイルの拡張子を表します。拡張子が無い場合は空文字列を表します。
- %X
-
拡張子以外すべてを表します。
- %s
-
定義されていれば、代替のファイルセパレータを表します。 定義されてい無い場合は、標準のファイルセパレータを表します。
- %%
-
パーセント自身を表します。
%d は数値のプレフィクスを取ることができます。
例:
'a/b/c/d/file.txt'.pathmap("%2d") => 'a/b' 'a/b/c/d/file.txt'.pathmap("%-2d") => 'c/d'
また、%d, %p, %f, %n, %x, %X には単純な文字列置換を行うための 置換パターンを表すパラメータを指定することが出来ます。 パターンと置換文字列はコンマで区切り全体を中括弧でくくります。 置換指定は、% と指示子の間に置きます。(例: "%{old,new}d") 複数の置換を行う場合はパターンをセミコロンで区切ってください。 (例: "%{old,new;src,bin}d")
正規表現や後方参照をパターンとして使用することがあるかもしれません。 中括弧、コンマ、セミコロンはパターンと置換文字列に使用しないでください。
例:
"src/org/onestepback/proj/A.java".pathmap("%{^src,bin}X.class") #=> "bin/org/onestepback/proj/A.class"
置換文字列に '*' を指定した場合は、置換文字列を計算するためにブロックを評価します。
例:
"/path/to/file.TXT".pathmap("%X%{.*,*}x") { |ext| ext.downcase } #=> "/path/to/file.txt"
String#pathmap_explode -> Array
[added by rake]-
自身をパスを表す部分ごとに分解して配列にして返します。
[SEE_ALSO] String#pathmap
String#pathmap_partial(n) -> String
[added by rake]-
自身から与えられた階層分パスを抜粋します。
与えられた数値が正である場合は左から、負である場合は右から抜粋します。
String#pathmap_replace(patterns) { ... } -> String
[added by rake]-
与えられたパスを前もって置き換えます。
- [PARAM] patterns:
- 'pat1,rep1;pat2,rep2;...' のような形式で置換パターンを指定します。