Help us understand the problem. What is going on with this article?

パーフェクトRuby RakeとRakefile

More than 3 years have passed since last update.

Rake

RakeはRubyで記述されたbuildツールでMakeやAnt,Mavenと同種のツールです。

設定ファイルに記述されている作業を上から順に実行してくれる

Rakeの特徴

  • Rubyで記述ができる
  • 言語内DSLを採用
  • Rakefileというファイルに一連の処理を定義する (この処理のまとまりを「タスク」と呼ぶ)

※ DSL...
Domain-Specific Language
特定の領域で特化して設計された言語
(例)Rake, RSpec, SQLとか

Rakefile

build定義を記述するファイル

  • rakeだったらRakefile
  • Antだったらbuild.xml
  • MakeだったらMakefile

Rakeの実行方法

Rakeはrakeコマンドに引数として、実行したいタスクを渡すことで
タスクを実行する。

rake 実行タスク名


以下のようにRakefileが記述されていた場合

desc 'Task description'
task :task_name do
  puts 'Rake task'
end

実行コマンド例

rake task_name # => Rake task

rakeコマンドに-Tオプションを渡して実行すると、
定義されているタスク一覧が表示できる
「desc」メソッドで説明文を記載しておけば、
タスク一覧には説明文も表示することができる。

rake -T
# 以下のように表示される
# rake task_name  # Task description

また、-tオプション(小文字のt)を指定するとトレース情報を得ることができる。

rake task_name -t
# 以下のように出力される
# ** Invoke task_name (first_time)
# ** Execute task_name
# =>Rake task

defaultについて
Rakeで何もタスクを指定していないときに実行されるタスク
以下のように定義する

task :default => :タスク名
task :default => :task_name

desc 'Task description'
  task :task_name do
  puts 'Rake task'
end
rake

taskメソッドとは別の定義の方法について

ファイルタスク

fileメソッドの引数にはファイル名の文字列を指定する
文字列が示すファイルがある場合はファイルタスクの実行がスキップされる。

使いどころ
* ファイルの有無判定

実行例 参考p.412 リスト 12.13

クリーンタスク

buildの過程でできた一時ファイルを一括で削除してくれる
利用するにはRakefileでrequire 'raka/clean'する必要がある

require 'rake/clean'
...

requireするとCLEANとCLOBBERいう定数が定義される。
この定数に削除したいファイル名を指定すると削除される。

require 'rake/clean'
...

CLEAN.include(./hoge/*) # includeメソッドで指定ができる

CLEANはbuildの過程でできた一時ファイル
CLOBER一時ファイルだけでなくbuildでできたファイルも消せる。


ディレクトリタスク

ディレクトリを自動で作ってくれるタスク
ディレクトリが存在しなければ自動で作成し、
存在していれば処理をスキップする。

つかいどころ

  • buildで作ったファイルを保存するディレクトリを作成するとき

使い方
directory メソッドにディレクトリ名を渡してあげる

directory "hoge" # hogeディレクトリを作成してくれる
#coding: utf-8

HOGE = "hoge_dir"
directory HOGE # この段階ではディレクトリは作られなかった
desc "directoryタスクの確認"
task :dir => HOGE do
  sh "ls hoge_dir" 
end
Hikaru-no-MacBook-Pro:ruby_practice fukuzawh$ rake dir -t
** Invoke dir (first_time)
** Invoke hoge_dir (first_time)
** Execute hoge_dir
mkdir -p hoge_dir
** Execute dir
ls hoge_dir

# 2回目
Hikaru-no-MacBook-Pro:ruby_practice fukuzawh$ rake dir -t
** Invoke dir (first_time)
** Invoke hoge_dir (first_time, not_needed)
** Execute dir
ls hoge_dir


ルール

特定のパターンの名前のファイルに対して動的に処理を定義する
ruleメソッドを使う

つかいどころ

  • 特定のファイル名や拡張子に対して動的に処理を加えたいとき

実行例 p.417 12-3-7
本の例では、タスクを実行するときに.cファイルをコンパイルすることをしている。


グループ化

動作が似ているタスクをグループ化する
namespaceメソッドを使う

つかいどころ

  • 動作が似ているタスクをグループ化したいとき
#coding: utf-8

namespace :check do
  desc 'ログファイルのチェック'
  task :log do
  end

  desc 'ymlファイルのチェック'
  task :yml do
  end
end

実行は以下のようにするとできる
rake namespace:タスク名

rake check:log

Rakeコマンドのオプション

man rake

または

rake --help

で調べる

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした