晴耕雨読

working in the fields on fine days and reading books on rainy days

[Ruby] Rake入門

MakeのRuby版である「Rake」の使い方について説明します。

Install Rake

rakeはrubyのライブラリです。なので、まずrubyがすでにインストールされている必要があります。 rubyのインストールについては省略します。

rakeのインストール

$ gem install rake

Execute Rake

rakeを実行するためには、Rakefileがあるディレクトリに移動してから次のコマンドを打ちます。

$ rake <taskname>

taskname を省略すると、defaultタスクが実行されます。

Rake Tasks

rakeが行うタスクはRakefileに記述します。Rakefileがなければ「Rakefile」という名前のファイルを作成します。 Rakefileに書くことのできるタスクは次のようなものがあります。

name Description
task 一番基本となるタスク
rule 拡張子を指定してファイルを作成するためのタスク
multitask 複数の事前条件を並列で行うタスク
file ファイルを作成するためのタスク
directory ディレクトリを作成するためのタスク
clean, clobber 定数 CLEAN, CLOBBER に含まれるファイルを削除するタスク(require 'rake/clean' が必要)

Task

一番基本となるタスク。タスクの処理内容や、依存関係を書くことができる。

# タスクの定義
task :taskA do
  # taskAが行う処理
end

# 前提条件を持つタスク
task :taskB => :taskA do
  # taskAが実行された後、taskBが実行される
end

# 前提条件のみ
task :taskC => [:taskA, :taskB]

# 複数の前提条件を持つタスク
task :taskD => [:taskA, :taskB] do
  # taskAとtaskBが実行された後、taskDが実行される
end

# task関数の前にdesc関数を置くことで、そのタスクの説明をする
desc 'sample task E'
task :taskE do
  # taskEが行う処理
end

# defaultを定義すると、タスク名を指定しないでrakeを実行した場合の動作を指定できる
task :default => :taskA

関数 task で定義したタスク名(ここでは taskA や taskB …など)は、rakeコマンドを実行する際にも使える。

$ rake taskA        # タスク :taskA を実行
$ rake taskD taskE  # タスク :taskD と :taskE を実行
$ rake              # タスク :default を実行

Rule

拡張子を指定してファイルを作成するためのタスク。

rule '.html' => '.md' do |t|
  sh "pandoc -s #{t.source} -o #{t.name}"
end

Multitask

タスクをより高速に実行できるように、依存する複数のタスクを並列して処理するタスク。

multitask :task => [:taskA, :taskB, :taskC] do
  puts 'Every task is completed!'
end

注意

複数のタスクを並列して処理するので、 「あるタスクを一番最初に実行する」とか 「このタスクは一番最後に終了させる」というのは指定できない。 実行する順番を指定する必要がある場合は、前述のtaskを使用すること。

File

ファイルを作成するためのタスク。基本的には必ず、依存するファイルを伴う

file 'report.dvi' => 'report.tex' do |t|
  sh "latex #{t.source}"
end

Directory

ディレクトリを作成するためのタスク。

directory 'path/to/dir'  # ディレクトリ path/to/dir/ が存在しなければ、作成する

file 'config.yml' => 'path/to/dir' do |t|
  sh "some-command > path/to/dir/config.yml"
end

Cleaning Task

rakeによって作られた中間ファイルや生成ファイルを削除するためのタスクは rake/clean に定義されています。 これらを利用するには、まず require 'rake/clean' をRakefileに追加します。

rake/clean には CLEANCLOBBER という2つの定数と、 cleanclobber という2つのタスクが定義されています。

定数

  • CLEAN : 中間ファイルのリスト
  • CLOBBER : 生成ファイルのリスト

CLEAN や CLOBBER の初期値は、何も登録されていません。これらへファイルを追加するには次のようなコードを書きます。

require 'rake/clean'
# => rake clean と rake clobber が使えるようになる

# 中間ファイル
CLEAN.include("output/*.dvi")
CLEAN.include("output/*.log")
CLEAN.include("output/*.aux")

# 生成ファイル
CLOBBER.include("output/*.pdf")

タスク

  • clean : 定数 CLEAN に追加されたファイルを削除するタスク
  • clobber : 定数 CLEAN と CLOBBER に追加されたファイルを削除するタスク

Rakefileに require 'rake/clean' と書いた上で、 rake clean もしくは rake clobber とコマンドを入力すると、 指定した中間ファイル・生成ファイルが削除されます。

Modules included

FileUtils

FileUtils にはシェル上での操作を行う関数が定義されています。 さらに rake は FileUtils に新たな関数をいくつか追加しています。 特に重要なのは sh で、引数の文字列をシステムコマンドとして実行する関数です。

sh "python foo.py"  # 引数の文字列 "python foo.py" を出力してから、foo.pyファイルをpythonで実行する

rake は実行時に FileUtils モジュールを require しているので、 FileUtils を新たに require する必要はありません。 FileUtils の詳細は rake の説明から離れるので、興味があれば FileUtils モジュールを参照してください。

Rake::FileList

Rake::Task

Rake::MakefileLoader

  • load(filename)

与えられた Makefile をロードします。