Makefileのように更新されたファイルのみコンパイルするCakefileのメモ
Cakefile
やってることは単純で、CoffeeScriptファイルの最終更新時刻がJavaScriptファイルの時刻より新しければコンパイルするだけです。
SRCDIRにCoffeeScriptファイルがあるディレクトリのパスを、OUTDIRに生成されるJavaScriptファイルの保存先を指定してください。
sys = require 'sys' fs = require 'fs' exec = require('child_process').exec COMMAND = 'coffee' OPTIONS = '-cb' SRCDIR = '.' # *.coffeeファイルがあるディレクトリへのパス OUTDIR = './js' # *.jsファイルの保存先 targetList = ['Hoge', 'Piyo'] # SRCDIR以下のすべてのCoffeeScriptファイルを指定したいときはこっち #targetList = [] #for f in fs.readdirSync SRCDIR # targetList.push RegExp.$1 if f.match /^(\w+)\.coffee$/ task 'all', 'compile target files', -> for target in targetList try cs = fs.statSync "#{SRCDIR}/#{target}.coffee" catch error sys.puts "file not found: #{error.path}" continue try js = fs.statSync "#{OUTDIR}/#{target}.js" continue if cs.mtime < js.mtime # 更新されていなければ次のターゲットへ catch error null # jsファイルが存在しなくても特に何もしない sys.puts "#{COMMAND} #{OPTIONS} -o #{OUTDIR} #{SRCDIR}/#{target}.coffee" exec "#{COMMAND} #{OPTIONS} -o #{OUTDIR} #{SRCDIR}/#{target}.coffee" task 'clean', 'delete target files', -> for target in targetList exec "rm #{OUTDIR}/#{target}.js"
おわりに
makeコマンドのように引数を指定しなくてもmakeして欲しいなーと思って、invokeを使う方法も考えたんですがうまく書けませんでした(:´Д`)
/usr/local/lib/coffee-script/lib/cake.js辺りを書き換えたらcakeコマンドの挙動を変えれそうですが、できればCakefile内で何とかしたいです。