自分にやさしく学ぶプログラミング

プログラミング学習記録、備忘録

Rakeはどう便利なのか勉強中

Rakeを使う利点てなんだ?という疑問

現在Rakeの使い方を勉強中なんですが、いまいち便利さが実感できません。 いや、大規模なプロジェクトなら依存関係とか簡単に整理できるの便利なんだろうなーとは思うんですが、やっぱり手元で便利さを実感したい。
と言うわけで、Rubyで書いたファイル生成スクリプトと、同様の機能を持ったRakefileを作って比較してみました。

ファイル生成スクリプト

今回作ったのは、testfile.txtというファイルを生成するスクリプトです。 また、依存関係を作るために、ディレクトリ作成と別ファイルからの読み込みを行なっています。

FileTree

  -Rakefile
  -Testdir
      -testfile.txt
      -additional.txt

makefile.rb (Rubyスクリプト)

  #frozen_string_literal: true

  require 'fileutils'

  TESTDIR = "Testdir"
  MAIN_FILE = "testfile.txt"
  SUB_FILE = "additional.txt"
  MAIN_FILE_PATH = "./#{TESTDIR}/#{MAIN_FILE}"
  SUB_FILE_PATH = "./#{TESTDIR}/#{SUB_FILE}"

  if !Dir::exist?(TESTDIR)
    Dir.mkdir(TESTDIR, 0755)
  end

  if !File::exist?(SUB_FILE_PATH)
    File.open(SUB_FILE_PATH, "w") do |file|
      file.puts "This is an additional text."
    end
  end

  File.open(MAIN_FILE_PATH, "w") do |file|
    file.puts "Make file test.\n", File.read(SUB_FILE_PATH)
  end

すでにTestdirディレクトリやadditional.txtが存在する場合にエラーにならないよう、exist?メソッドで確認してから作成していますが、確かにこれはめんどくさい。
何より、この記述だと「testfile.txtを作るためにはTestdirディレクトリとadditional.txtが必要である」と言う依存関係がわかりづらいです。

Rakefile

  #frozen_string_literal: true

  TESTDIR = "./Testdir"
  MAIN_FILE = "testfile.txt"
  SUB_FILE = "additional.txt"
  MAIN_FILE_PATH = "#{TESTDIR}/#{MAIN_FILE}"
  SUB_FILE_PATH = "#{TESTDIR}/#{SUB_FILE}"

  task :default => MAIN_FILE_PATH

  desc "Make main_file"
  file MAIN_FILE_PATH => SUB_FILE_PATH do
    File.open(MAIN_FILE_PATH, "w") do |file|
      file.puts "Make file test.\n", File.read(SUB_FILE_PATH) 
    end
  end

  desc "Make sub_file"
  file SUB_FILE_PATH => TESTDIR do
    File.open(SUB_FILE_PATH, "w") do |file|
      file.puts "This is an additional text."
    end
  end

  desc "Make a new directory"
  directory TESTDIR

Rakeの場合、まず依存関係がわかりやすいですね。
また、わざわざ条件分岐しなくても自動で事前タスクを確認してよしなにやってくれるのは楽。
あと、最大の目的であるtestfile.txtの生成が一番先頭にくるのもわかりやすいと思いました。

まとめ:便利なのはわかったが・・・

確かにRake使った方がわかりやすいなーと思ったんですが、今回の記述だと、なんやかんやでRakefileの方が長くなってしまったという・・・。
まあそれは書き方の問題な気がします。DRYな書き方を意識したつもりだったんですが、下手に定数使わない方がわかりやすいのかも。 今回みたいな単純な例ではなく、もっと多くの依存関係が絡んだプロジェクトだったら、いちいちif文書いてらんないでしょうし、Rake使った方が楽できそうだと言うことが理解できました。
今後いい事例に出会ったら、また記事にしたいと思います。