Ruby 1.9.2 リファレンスマニュアル > ライブラリ一覧 > library rake

library rake

要約

Rake というコマンドラインツールを扱うライブラリです。

Rake とは

Rake は Make によく似た機能を持つ Ruby で書かれたシンプルなビルドツールです。

Rake は以下のような特徴を持っています。

@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;...' のような形式で置換パターンを指定します。

Classes

Sublibraries