*RubyでScalaスクリプトをコンパイルするツールを作成する。 [#vd683dab] *仕様 [#df26398e] **ツール1 タイムスタンプスナップ機能 [#ac9ea477] フォルダ内の.scalaファイルのタイプスタンプのスナップを取得する。 **ツール2 更新ファイル抽出機能 [#g2830135] 既存のタイムスタンプと現在のファイルのタイムスタンプを比較し更新されたファイルを取得する。 **ツール3 一括コンパイル機能 [#g906e4b2] ファイル一覧のファイルをコンパイルする **ツール4 特定ファイル実行機能 [#p3901436] *ツール1 タイムスタンプスナップ機能 [#la5cc9ff] **rubyのディレクトリ関連の処理 [#q1973441] ***ディレクトリ中のファイル一覧を取得する [#ic08cdb2] -コード例 p Dir::entries("/home/take") --結果 [".", "..", "WorkbookScala.scala"] ***ワイルドカードにマッチしたファイル全てに処理を行う [#nda0b89a] -コード例 p Dir::entries("/home/take") --結果 [".", "..", "WorkbookScala.scala"] ---注意点 フォルダの区切り文字は\ではなく、/を使うこと ***ファイルのタイムスタンプを取得する [#ud2674ec] -例 s = File.stat("c:/scala/user/src/WorkbookScala.scala") puts File.mtime(fname).strftime("%Y/%m/%d %H:%M:%S") # 最終更新時刻 -結果 c:/scala/user/src/WorkbookScala.scala 2009/12/05 22:16:11 ***snap_timestamp.rb [#hffed54a] path=ARGV[0].gsub("\\","/") ext="scala" outfile="timestamp.txt" buffer = "" # **は再帰的検索。\0は複数パターンの区切り。.*は隠しファイル取得 Dir.glob("#{path}/**/*\0#{path}/**/.*" + ext).each{|name| puts name buffer = buffer + name + "\n" s = File.stat(name) timestamp = File.mtime(fname).strftime("%Y/%m/%d %H:%M:%S") # 最終更新時刻 puts timestamp buffer = buffer + timestamp + "\n" } # タイムスタンプスナップを上書き更新します。 file = File.open(path + "/" + outfile, "w"); # 書き込む file.write(buffer); file.close -使い方 ruby c:\scala\bin\snap_timestamp.rb "c:\scala\user\src" --指定したフォルダにtimestamp.txtが出力されファイルのタイムスタンプのスナップショットがとれます。 **snap_timestamp_diff.rb [#a7a5adf5] 更新したファイルを出力する #第一引数はフォルダ名 path=ARGV[0].gsub("\\","/") ext=/.*\.scala$/ outfile="timestamp.txt" current={} # **は再帰的検索。\0は複数パターンの区切り。.*は隠しファイル取得 Dir.glob("#{path}/**/*\0#{path}/**/.*" ).each{|name| if ext =~ name s = File.stat(name) current.store(name,File.mtime(name).strftime("%Y/%m/%d %H:%M:%S")) end } # タイムスタンプ保存用ファイル読み込み before={} file = open(path+"/"+outfile) buffer = file.read().split("\n"); file.close #2行を1つの配列にまとめた配列を作成 newItem="" newItem = nil buffer.each{|line| if newItem == nil newItem=line else if ext =~ newItem before.store(newItem,line) end newItem = nil end } #タイムスタンプの比較 更新・新規追加したファイルを出力 current.each{|filepath, timestamp| if timestamp != before.fetch(filepath) puts filepath end } -使い方 snap_timestamp_diff.rb "c:\scala\user\src"