Skip to content

Instantly share code, notes, and snippets.

@hokaccha
Created February 28, 2012 12:47
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hokaccha/1932326 to your computer and use it in GitHub Desktop.
Save hokaccha/1932326 to your computer and use it in GitHub Desktop.
Cakefile
#
# modules
#
fs = require 'fs'
{exec} = require 'child_process'
#
# options
#
option '-s', '--silent', 'no output logs'
#
# config
#
script_out = 'js/script.js'
script_min = 'js/script.min.js'
script_dir = '_src/js/script'
script_files = [
"#{script_dir}/model.js"
"#{script_dir}/view.js"
"#{script_dir}/main.js"
]
lib_out = 'js/lib.js'
lib_dir = '_src/js/lib'
lib_files = [
"#{lib_dir}/jquery.min.js"
"#{lib_dir}/underscore-min.js"
"#{lib_dir}/backbone-min.js"
]
sass_out = 'css/style.css'
sass_dir = '_src/sass'
sass_in = "#{sass_dir}/style.scss"
sass_files = fs.readdirSync(sass_dir).map (file) -> "#{sass_dir}/#{file}"
#
# tasks
#
task 'build:all', 'build all', (opt) ->
invoke 'build:lib'
invoke 'build:script'
invoke 'build:css'
task 'build:lib', "build #{lib_dir}/* to #{lib_out}", (opt) ->
concat lib_files, lib_out
console.log "build #{lib_out}" unless opt.silent
task 'build:script', "build #{script_dir}/* to #{script_out}", (opt) ->
concat script_files, script_out
console.log "build #{script_out}" unless opt.silent
invoke 'build:minscript'
task 'build:minscript', "build #{script_out} to #{script_min}", (opt) ->
system "uglifyjs #{script_out} > #{script_min}", (err) =>
console.error err.toString().red if err
console.log "build #{script_min}" unless opt.silent
task 'build:css', "build #{sass_in} to #{sass_out}", (opt) ->
system "sass #{sass_in} #{sass_out}", (err) =>
console.error err.toString().red if err
console.log "build #{sass_out}" unless opt.silent
task 'watch', 'watch _src/js/script/* _src/sass/*', (opt) ->
console.log 'watch start _src/js/script/* _src/sass/*'.yellow unless opt.silent
watch sass_files, => invoke 'build:css'
watch script_files, => invoke 'build:script'
#
# util funcs
#
concat = (files, out) ->
str = files.map (file) ->
fs.readFileSync file, 'utf8'
.join '\n'
fs.writeFileSync out, str, 'utf8'
system = (cmd, fn) ->
exec cmd, (err, stdout, stderr) =>
return fn(err) if err
return fn(stderr) if stderr
return fn(null, stdout)
watch = (files, fn) ->
for file in files
fs.watchFile file, { interval: 200 }, (curr, prev) ->
fn() if curr.mtime > prev.mtime
colors = {
blue : ['\033[34m', '\033[39m']
cyan : ['\033[36m', '\033[39m']
green : ['\033[32m', '\033[39m']
magenta : ['\033[35m', '\033[39m']
red : ['\033[31m', '\033[39m']
yellow : ['\033[33m', '\033[39m']
}
for name, color of colors
do (name, color) ->
String.prototype.__defineGetter__ name, ->
"#{color[0]}#{@}#{color[1]}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment