HelloWorld程度ならば、こんなことはしないのですが、 使えるプログラムはたくさんのjarをインクルードしたものになりがちです。 標準のコンパイル方法ではクラスパスにJARファイルを追加するのが手作業では、 追加するクラスパスやJARファイルが増えるにしたがって手作業では困難になってきます。 かといって、Mavenをつかってみたんですが無駄な動作をしているし、 Eclipseはコンパイル結果にちょっと癖があって使いづらい。 となれば、自分で簡潔に動作するツールをつくってしまおうとおもったわけです。
フォルダ内の.scalaファイルのタイプスタンプのスナップを取得する。
既存のタイムスタンプと現在のファイルのタイムスタンプを比較し更新されたファイルを取得しコンパイル可能なバッチファイルを生成する
BASEが2回出てきているが、どちらも自動的にJarファイルを読み込みたいフォルダである。下記の例のように追加したいフォルダの数だけ繰り返し記述するとよいでしょう。
@echo off setlocal ENABLEDELAYEDEXPANSION set CP=. set BASE=C:\scala\lib for %%f in (%BASE%\*) do set CP=!CP!;%%f set BASE=C:\scala\lib\user for %%f in (%BASE%\*) do set CP=!CP!;%%f SET SCALA_DOC_HOME="C:\scala\doc" ECHO %CP% scalac -classpath %CP% %1
p Dir::entries("/home/take")
[".", "..", "WorkbookScala.scala"]
p Dir::entries("/home/take")
[".", "..", "WorkbookScala.scala"]
フォルダの区切り文字は\ではなく、/を使うこと
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
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"
更新したファイルを出力する
#第一引数はフォルダ名
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
}
ruby snap_timestamp_diff.rb "c:\scala\user\src"
RubyをWindowsのDOSで動作させるとRubyからバッチファイルを動作させる際に使用する システムのShellが使用している
のPathの分割処理がバグっているというかcygwinしか想定していないので、 使えません。 動かしてもwindows版rubyにはfork関数が最初から実装されていないっぽい。 つまり複数プロセスの同時実行には対応していない。
別途prototype.jarをつくって、簡単に取得できるようにつくっておきました。
簡潔でしょ?
下記の例は簡潔にかけているんだけど、実際にはInputStream?を閉じないとそのうち不具合がでるので、しっかりとcloseする処理が必要です。
その点上のprototype.jarを使えば、その点が考慮されているばかりか、文字列、配列の基本クラスの拡張までやってくれるので、
開発効率がアップしますよん。
Runtime r = Runtime.getRuntime();
Process p = r.exec("java -version");
Runtime r = Runtime.getRuntime();
Process p = r.exec(new String[] {
"C:\\Program Files\\Java\\j2re1.4.2_13\\bin\\java",
"-version" });
Runtime r = Runtime.getRuntime();
Process p = r.exec("cmd /c echo zzz");
// Process p = r.exec(new String[]{ "cmd", "/c", "echo", "zzz" });
String[] env = new String[2];
env[0] = "TEST=サンプル";
env[1] = "PATH=" + System.getProperty("java.library.path");
Runtime r = Runtime.getRuntime();
Process p = r.exec("cmd /c echo %TEST%", env);
http://www.ne.jp/asahi/hishidama/home/tech/java/process.html#Runtime
いままでタイトルには反してここではSCALAをつかってコンパイルします。
import prototype.Prototype._
(args(0) + "\timsstamp.txt").readfile{line :String =>
("scalacc " + line).exe
}