Cake

Cake는 정말 쉽고 간단하다. Makefile대신 Cakefile만 만들면 된다.

Cake

Hello World!

Cake 자체는 별로 설명할게 없다. Cakefile을 우선 다음과 같이 만든다:

:::coffee
task 'say:hello', 'Description of task', ->
  console.log 'Hello World!'

그리고 task say:hello라고 실행하면:

:::bash
$ cake say:hello
Hello World!

task 이름 없이 실행하면 실행할 수 있는 task를 모두 보여준다:

$ cake

cake say:hello             # Description of task

Option

production, development 등 환경에 따라 다르게 실행시키고 싶다면 다음과 같이 option을 정의한다:

:::coffee
option '-e', '--environment [ENVIRONMENT_NAME]', 'set the environment for `task:withDefaults`'
task 'task:withDefaults', 'Description of task', (options) ->
  options.environment or= 'production'

이 코드는 다음과 같이 실행한다.

:::bash
$ cake -e "development" task:withDefaults

Use Case

Compile

src/.coffee 파일을 out/.js로 컴파일하는 명령어는 다음과 같다:

$ coffee --compile --output lib/ src/

이 cake로 하려면 다음과 같이 한다.

:::coffee
{exec} = require 'child_process'
task 'build', 'Build project from src/*.coffee to lib/*.js', ->
  exec 'coffee --compile --output lib/ src/', (err, stdout, stderr) ->
    throw err if err
    console.log stdout + stderr

{exec} = require 'child_process'Destructuring Assignment라는 것으로 js로 컴파일시 var exec = require('child_process').exec와 같다.

간단히 말해서 task를 이용해서 child process로 coffee --compile --output lib/ src/를 실행하는 것 뿐이다.

Concatenating Files

파일을 하나로 합친다. 한 마디로 브라우저용이다. 개발은 Module별로 파일을 나눠서 하지만 배포는 하나로 하는 것이다.

fs     = require 'fs'
{exec} = require 'child_process'

appFiles  = [
  # omit src/ and .coffee to make the below lines a little shorter
  'content/scripts/statusbar'
  'content/scripts/command/quickMacro'
  'content/scripts/command/selectionTools/general'
]

task 'build', 'Build single application file from source files', ->
  appContents = new Array remaining = appFiles.length
  for file, index in appFiles then do (file, index) ->
    fs.readFile "src/#{file}.coffee", 'utf8', (err, fileContents) ->
      throw err if err
      appContents[index] = fileContents
      process() if --remaining is 0
  process = ->
    fs.writeFile 'lib/app.coffee', appContents.join('\n\n'), 'utf8', (err) ->
      throw err if err
      exec 'coffee --compile lib/app.coffee', (err, stdout, stderr) ->
        throw err if err
        console.log stdout + stderr
        fs.unlink 'lib/app.coffee', (err) ->
          throw err if err
          console.log 'Done.'

Minify/Compress Your Files

Google Closore Compiler로 컴파일 하기

task 'minify', 'Minify the resulting application file after build', ->
  exec 'java -jar "/home/stan/public/compiler.jar" --js lib/app.js --js_output_file lib/app.production.js', (err, stdout, stderr) ->
    throw err if err
    console.log stdout + stderr

참고