Skip to content

Instantly share code, notes, and snippets.

@gawaooooo
Last active December 11, 2015 03:38
Show Gist options
  • Save gawaooooo/4539247 to your computer and use it in GitHub Desktop.
Save gawaooooo/4539247 to your computer and use it in GitHub Desktop.
Cakefile
fs = require 'fs'
{exec, spawn} = require 'child_process'
{parser, uglify} = require 'uglify-js'
files = []
# 該当パスのファイルを取得するやつ
get_file = (path) ->
text = ''
stat = fs.statSync(path)
if stat.isDirectory()
#console.log 'directory:', path
f = fs.readdirSync(path).sort()
#console.log f
path_base = path.replace(/\/$/, '') + '/'
#console.log path_base
for file in f
#text += "\n\n" + get_file(path_base + file)
get_file(path_base + file)
else if stat.isFile()
#console.log 'isfile:',path
#text += "\n\n" + fs.readFileSync(path, 'utf-8')
# TODO .js or .coffee
files.push path if path.match(/^(.+)(\.js$|\.coffee$)/)
#console.log text
#console.log "return files: #{files}"
files
# defaultのディレクトリ
def =
src: './src'
dist: './dist'
# commandを実行するやつ
# execより spwanの方がいいのかもしれない
run = (cmd, args, cb, err_cb) ->
console.log "call run: cmd:#{cmd} , args: #{args.join(' ')}"
exec "#{cmd} #{args.join(' ')}", (err, sout, serr) ->
if err isnt null
console.error serr
if typeof err_cb is 'function'
err_cb()
else
throw "Failed command execution (#{err})."
else
cb() if typeof cb is 'function'
# ファイルorディレクトリを指定してコンパイル
# src -> ディレクトリorファイル path
# dist -> ディレクトリ
compile = (src, dist, bare, cb) ->
src = src or def.src
dist = dist or def.dist
bare = bare or ''
console.log "\n Compile...: #{src} to #{dist}. option is #{bare} \n\n"
run 'coffee', ['-o', dist, bare, '-c', src], cb, (sout) ->
console.log 'finish compile', sout
# ファイルorディレクトリを指定してminify
# src -> minifyするファイルorディレクトリ
minify = (src, cb) ->
src = src or './dist'
console.log "\n Compressiong...: #{src}\n\n"
#console.log process.cwd()
# fileのlistを取得
minFiles = get_file(src)
#console.log 'getfile---'
#console.log minFiles
#console.log minFiles.length
for f in minFiles
#console.log f
if f.match(/\.min\.js$/)
continue
if f.match(/^(.+)\.js$/) and f
console.log "compress #{f}"
#console.log RegExp.$1
minFile = "#{RegExp.$1}.min.js"
# fileの存在確認とか?
###
exec "uglifyjs -o #{minFile} #{f}", (err, sout, serr) ->
console.log "finish compress... "
###
run 'uglifyjs', ['-o', minFile, f], cb, (sout) ->
console.log "finish compress...", sout
# TODO watch
watch = (options, cb) ->
src = options.src or def.src
dist = options.dist or def.dist
if options.bare? then bare = '-b'
else bare = ''
console.log "\n Start Watch changes \n\n"
watchFiles = get_file(src)
console.log '\n watch files start... \n'
for file in watchFiles then do (file) ->
console.log "#{file}"
fs.watchFile file, (curr, prev) ->
#console.log curr, prev
if +curr.mtime isnt +prev.mtime
console.log "\n Saw change in #{file} \n"
file.match /.*\/(.+)$/
distDir = file.replace(RegExp.$1, '').replace(src, dist)
console.log "#{file} compile to #{distDir} directory"
compile file, distDir, bare, ->
# TODO ここのdistDirのファイル名
console.log "#{distDir}#{RegExp.$1}".replace('coffee', 'js')
cb("#{distDir}#{RegExp.$1}".replace('coffee', 'js')) if typeof cb is 'function'
# TODO doc
doc = (src) ->
src = src or options.src
console.log "\n Start create docs... \n\n"
files = get_file(src)
run 'docco', [files.join(' ')], (sout) ->
console.log "\n finish create docs. see docs folder. "
# 指定ディレクトリのコンパイル
# optionでsrcとdistディレクトリを指定出来るようにする
option '-s', '--src [DIR]', 'ソースとなるCoffeeScriptが格納されたディレクトリ またはファイル'
option '-d', '--dist [DIR]', '出力先のディレクトリ'
option '-b', '--bare', '-b指定でセーフティ関数を使わない'
# TODO ディレクトリのコンパイルも出来るし、ファイルのコンパイルも出来るようにしたい
#
task 'compile', '対象のディレクトリをコンパイルする(default >> -s ./src -o ./dist)', (options) ->
src = options.src or def.src
dist = options.dist or def.dist
if options.bare? then bare = '-b'
else bare = ''
###
exec "coffee -o #{dist} #{bare} -c #{src}", (err, sout, serr) ->
console.log 'finish compile'
###
###
run 'coffee', ['-o', dist, bare, '-c', src], (sout) ->
console.log 'finish compile', sout
###
compile src, dist, bare
# min test
# 指定ディレクトリ配下のすべての*.jsファイルをminifyする
task 'min', '対象のディレクトリのファイルを圧縮(default >> -s ./dist)', (options) ->
# TODO *.min.js は削除した方がいいかも。もしくは、圧縮する時に除外
src = options.src or './dist'
minify src
# compile and minify
task 'cam', 'compile and minify', (options) ->
src = options.src or def.src
dist = options.dist or def.dist
if options.bare? then bare = '-b'
else bare = ''
# TODO
compile src, dist, bare, ->
minify dist
# CoffeeScriptの監視
# TODO -cをしないでwだけやって、変更されたsrcをcompileするようにしたらいいのかも
task 'watch', 'Watch src/ for changes and compile', (options) ->
src = options.src or def.src
dist = options.dist or def.dist
if options.bare? then bare = '-b'
else bare = ''
###
run 'coffee', ['-o', dist, bare, '-c', '-w', src], (sout) ->
console.log 'finish compile', sout
###
###
watch = spawn 'coffee', ['-w', src]
watch.stderr.on 'data', (data) ->
process.stderr.write data.toString()
watch.stdout.on 'data', (data) ->
console.log data.toString()
console.log 'file changed'
console.log watch
###
compile src, dist, bare, ->
watch options
task 'wam', 'Watch src/ for changes and compile and minify', (options) ->
src = options.src or def.src
dist = options.dist or def.dist
if options.bare? then bare = '-b'
else bare = ''
compile src, dist, bare, ->
watch options, minify
# document
task 'doc', 'doccoを使用してdocsにドキュメントを作成(default >> -s ./src)', (options) ->
src = options.src or def.src
doc src
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment