Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

RubyのRakeとは?タスクランナーの基本と実践的な使い方を解説

Rakeは、Rubyで最も広く使われているタスクランナー(タスク自動化ツール)です。データベースのバックアップやテスト実行など、プロジェクトで繰り返し行う作業をコマンド一つで実行できるようにしてくれます。

「タスク」とは何か?

Rakeで管理する「タスク」の具体例を見てみましょう。

  • データベースのバックアップを作成する
  • テストスイートを実行する
  • 統計情報を収集してレポートする

これらは小さな処理ですが、Rakeがなければプロジェクト内のさまざまなファイルに散らばってしまい、管理が煩雑になります。

Rakeを使えば、こうしたタスクへのアクセスを一元化できます。さらに、特定のパターンに一致し、かつ最近更新されたファイルを探すといった処理も簡単に行えます。

RakeとRackは別物!混同に注意

名前がとても似ているため混同されがちですが、この2つはまったく異なるものです。

  • Rake: タスクを実行するためのタスクランナー
  • Rack: Rubyのサーバーとフレームワークが連携できるようにするインターフェース

それでは、Rakeについて詳しく見ていきましょう。

Rakeを使っているのは誰?

答えはRailsです。

Railsでの開発経験があれば、rake db:migrateというコマンドを目にしたことがあるはずです。rake routesもよく使われますよね。これこそがRakeの実例です。

なお、Rails 5.0以降では、ほとんどのrakeコマンドをrailsコマンドでも呼び出せるようになりました。

つまりrails db:migrateのように書けますが、実際に処理を行っているのはRakeだという点は変わりません。

Rakeタスクの書き方

まずはシンプルなRakeタスクの例から紹介します。

desc "果物をもっと食べるようリマインドする"

task :apple do
  puts "もっとりんごを食べよう!"
end

このコードはRakefileというファイルに記述します。Railsアプリケーションの場合は、lib/tasks/apple.rakeとして保存するのが一般的です。

タスクの実行方法

rake apple

# "もっとりんごを食べよう!"

タスクの中には通常のRubyコードをそのまま書けますが、Rakeが提供している便利なメソッドもあります。

主なメソッドの例

  • ruby:Rubyファイルを実行する
  • sh:システムコマンドを実行する
  • safe_ln:ファイルシステム上にシンボリックリンクを作成する

また、RakeにはFileUtilsモジュールが組み込まれています。そのため、cpでファイルをコピーしたり、mkdir_pでディレクトリを作成したり、chownでファイルの所有権を変更したりすることも可能です。

具体例

task :clean_cache do
  rm_r FileList["tmp/cache/*"]
end

rm_r(再帰的に削除)は確認なしでファイルを削除するため注意が必要です。確認ステップを挟みたい場合は、後述する「依存タスク」を活用し、続行したくない場合に例外を発生させるのがおすすめです。

特定のディレクトリ内でRakeコマンドを実行する

特定のディレクトリの中でRakeコマンドを実行したいケースもあるでしょう。その場合は以下のように書きます。

task :import do
  puts "データをインポート中..."

  Dir.chdir(Rails.root.join("data")) { ruby "load-data.rb" }
end

この例では、Railsプロジェクトのdataフォルダ内でRubyスクリプトを実行しています。

ネームスペースの使い方

タスク名が似通ってくると、うっかり同じ名前を重複させてしまうことがあります。そこで活躍するのがネームスペースです。

たとえば、バックアップ関連のタスクをすべてbackupネームスペースにまとめられます。

namespace :backup do
  task :create do
    # ...
  end

  task :list do
    # ...
  end

  task :restore do
    # ...
  end
end

ネームスペース付きタスクの実行方法

rake backup:create

依存タスク(前提タスク)の定義

Rakeでは、現在のタスクより先に実行しておくべきタスクのリストを定義できます。これにより、タスクに必要な準備処理を事前に済ませておけます。

task create_examples: "load_database" do
  # ...
end

この例では、create_examplesの前にload_databaseが実行されます。

依存タスクのリストは、文字列の配列やシンボルの配列として指定することもできます。

タスクの中から別のタスクを実行する

「事前に実行する」のではなく、「現在のタスクの処理中に別のタスクを呼び出したい」場合は、次のように書きます。

task :coverage do
  ENV['COVERAGE'] = 'true'
  Rake::Task["test"].execute
end

テストカバレッジを有効にする環境変数などを設定してからテストタスクを呼び出す、といった用途に便利です。

Rakeルールの使い方

ルール(Rules)は、ファイル拡張子の変換処理を定義する仕組みです。

task compress: FileList["/tmp/*.txt"].ext(".txt.gz")

rule '.txt.gz' => '.txt' do |t|
  sh "gzip", "-k", "-f", t.source
end

ルールを使うメリットは、一度圧縮されたファイルは、元のファイルが変更されるまで再圧縮されない点です。無駄な処理を省けるのです。

このコードのポイント

  1. Rakeに含まれるFileListクラスを使い、対象となるファイルのリストを定義しています。
  2. ルールは変換の拡張子(ターゲット)から始まるため、マッチさせるにはFileListに対して.ext(".txt.gz")を適用します。
  3. '.txt.gz' => '.txt'という記述は「txt.gzからtxtへ変換する」という意味ではなく、逆に「txtからtxt.gzへ変換する」という意味です。矢印はハッシュ構文なので注意しましょう。

覚えておきたいRakeのオプションとコマンド

実務で役立つRakeオプションの一覧

  • rake -T:利用可能なタスクの一覧を表示
  • rake -P:タスクとその依存関係を一覧表示
  • rake -W:タスクとその定義場所を一覧表示
  • rake -V:詳細モード(システムコマンドをエコー表示)
  • rake -t:デバッグモード
  • rake -f:特定のRakefileを指定して使用

Railsアプリでの実行例

> rake -T test

rake test         # testフォルダ内の全テストを実行(systemテストを除く)
rake test:db      # テストを高速に実行しつつDBもリセット
rake test:system  # systemテストのみ実行

まとめ

本記事では、Rubyの人気タスクランナーであるRakeについて学びました。

rake -Tで利用可能なタスクを確認し、独自のタスクを作成してRakefilelib/tasksフォルダに追加してみましょう。そして忘れないでほしいのは、RakeRackはまったく別のものだということです。

この記事が役に立ったら、ぜひ周りの人にもシェアしてください 🙂

最後までお読みいただきありがとうございました!

  1. iPhoneの「ガイド付きアクセス」とは?設定方法と使い方を徹底解説

    ガイド付きアクセスとは? スマートフォンを人に渡すと、つい画面を覗き見されてしまう——こんな経験はありませんか?友達に面白い写真を見せるつもりでiPhoneを渡したのに、気づけば勝手にスクロールされ、個人的なデータまで見られていた…。こうした事態を防ぐために、Appleは「ガイド付きアクセス(Guided Access)」という機能を用意しています。 画像出典: Imore.com ガイド付きアクセスは、iPhoneやiPadでひとつの作業に集中できるよう設計されたアクセシビリティ機能です。デバイスの使用を単一のアプリに制限するだけでなく、そのアプリ内で使える機能まで細かくコントロールできま

  2. RSSフィードとは?基本の仕組みとパソコンでの使い方を徹底解説

    読書は、豊富な知識を得られるだけでなく、対人スキルの向上にも役立つ健康的な習慣です。インターネットの普及により、紙を節約してエコに読書を楽しめるようになりましたが、その一方で「読む価値のあるコンテンツを見つけにくい」という新たな悩みも生まれています。膨大な情報の中から良質な記事を選び出すのは、ネット読書における大きな課題の一つです。 そんな問題を解決するために開発されたのがRSSフィードです。RSSを活用すれば、読みたい・観たいコンテンツを探す手間が大幅に省けます。購読しているサイトや著者の最新情報が、RSSアグリゲーター(専用ソフト)に自動的に届くため、わざわざウェブサイトを訪問する必要があ