スクリプト系の仕事は、とりあえず rakefile.rb を作る。完成するまで何度も rake で実行して動作を確認しながら実装する。
#!/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 するのが安全。