rakefile 仕事術

スクリプト系の仕事は、とりあえず rakefile.rb を作る。完成するまで何度も rake で実行して動作を確認しながら実装する。

  • Ubuntu で sudo apt-get install ruby1.9 してあれば rake1.9 というコマンドが使える
  • ruby 1.9.x を make install すれば /usr/local/bin/rake が使える
  • logger を併用すると便利 http://www.ruby-lang.org/ja/man/html/logger.html
#!/usr/bin/ruby -Ku
task :default do
  # do something here
end

外部コマンドを呼び出すときは sh を使う。 system でもよいが、sh の場合は実行するコマンドをコンソールにも出力してくれる。 ファイル操作は require 'fileutils' して FileUtils.mkdir_p や FileUtils.mv などを使うと移植性が高くなる。

必要ならタスクを増やす。 関連する別の仕事に移るときには、default タスクを別の名前に変更して、新たに default タスクを作る。

複数のタスクにコメントをつけたければ desc を使う。

desc "hoge hoge"
task :default do
  # do something here
end

rake -T で desc がつけられたタスクの一覧を表示。

必要に応じて依存関係を使う。

task :default => [:sometask] do end

実行時に「名前つき引数」を渡したいとき、rake では環境変数を使う。

EX  = (ENV['EX']  || '1').to_i
NUM = (ENV['NUM'] || '1').to_i

rake EX=2 NUM=3 のように使う。

必要に応じてリファクタリングする。Don't repeat yourself 原則。

複数のタスクで共通に使う値は定数にする。

BASEDIR = "/data/experiment"
DIR_01 = BASEDIR + "/ex01"
DIR_02 = BASEDIR + "/ex02"

コマンドの出力(標準出力および標準エラー出力)を日付の入ったファイル名のログで書き出す。

task :default do 
  logname = "_some_command_log_" + Time.new.strftime("%Y%m%d")
  sh "some_command args >#{logname} 2>&1"
end

shを書き換えて、system の出力をlogに出してみる。

$hostname = `hostname`.chomp
 
def init_log
  FileUtils.mkdir_p("_log")
  fname = Time.new.strftime("%Y%m%d-%H%M%S")
  $log = Logger.new("_log/#{$hostname}-#{fname}.log")
end
 
def sh(s)
  $log.info(s)
  tmpname = "__tmpfile.#{$hostname}.#{rand(10000)}"
  system("#{s} >#{tmpname} 2>&1")
  $log.info(File.read(tmpname))
  File.unlink(tmpname)
end
 
init_log

TODO: system の後で $? をチェックして raise するのが安全。

rakefile.txt · 最終更新: 2010/12/06 14:16 by Takuya Nishimoto
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0