Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

CoffeeScript의 빌드도구 Cake

Unix에서는 빌드자동화를 위해서 Make라는 도구를 보통 사용합니다. 어떤 빌드작업이 필요할때 Makefile이라는 파일을 두고 make명령어를 실행하면 Makefile에 정의된 빌드가 자동으로 실행됩니다. 빌드를 어떻게 해야한다고 설명하는 대신에 간단히 사용할 수 있는 것인데 커피스크립트에도 이러한 빌드 도구가 포함되어 있습니다.

웹브라우저에서 커피스크립트 컴파일러만 불러들여서 사용한다면 쓸 수 없지만 Unix기반에서는 보통 Node.js와 함께 npm을 이용해서 커피스크립트를 설치하기 때문에 이렇게 설치할 경우 커피스크립트의 빌드도구인 Cake를 사용할 수 있고 Cake의 파일은 Cakefile입니다.(Make를 Cake로 바꿔서 Make를 연상시킬수 있으면서 커피와 케이크라니 네이밍 센스가 참 좋군요.)

Cakefile은 cake명령어로 실행할 수 있으며 cake를 실행하는 위치에 Cakefile라는 파일이 존재하면 됩니다. 파일이 없을 경우 오류가 납니다. 커피스크립트를 NPM으로 글로벌설치를 하였다면 자동으로 Cake로 설치가 됩니다. Cake의 사용법을 보기 위해서 다음과 같이 간단한 Cakefile을 만들어 보겠습니다.


task 'helloworld', 'echo hello world', ->
  console.log 'Hello World'

task라는 이름으로 해야할 작업을 정의해 주면 되는데 다음과 같은 형식으로 정의합니다.

task 테스크이름, 테스크설명, 실행할함수

그래서 위 코드는 helloworld라는 테스크는 console.log로 "Hello World"라고 출력해 주도록 정의한 것입니다.


$ cake
cake helloworld          # echo hello world
$ cake helloworld
Hello World

다른 파라미터없이 커맨드라인에서 cake 명령어를 실행하면 Cakefile에 정의된 테스크의 리스트를 출력해 줍니다. 그리고 cake helloworld를 실행하면 해당 테스크에 정의된 함수가 실행되는 것을 볼 수가 있습니다.  Cakefile은 사실 커피스크립트 파일이기 때문에 커피스크립트 문법을 그대로 사용할 수 있으며 Node.js까지 같이 사용하면 필요한 작업은 어떤 것이든 할 수 있습니다.  task정의는 사실 task라는 함수에 파라미터 3개를 넘겨준 것이고 실행되면 마지막 파라미터의 콜백함수가 실행되는 것입니다.

커피스크립트를 자바스크립트 파일로 컴파일 해주는 다음과 같은 빌드작업을 자동화 할 수도 있습니다.


{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


task build를 실행하면 src 폴더에 있는 모든 커피스크립트 파일을 자바스크립트로 컴파일해서 lib 폴더에 두게 됩니다. {exec} = require 'child_process'는 커피스크립트의 Destructuring Assignment 기능입니다. 예를 들면 {a, b} = {a:1, b:2}를 실행하면 자동으로 a변수에는 1이 b변수에는 2가 할당되는 것이므로 exec = (require 'child_process').exec와 동일합니다. exec를 이용하면 커맨드라인에서 사용하는 명령어를 그대로 실행시킬 수 있습니다.

커피스크립트의 위키를 참고하면 더 많은 예제에 대해서 확인할 수 있습니다. 사실 저는 쉘로 컴퓨터를 배우진 않았기 때문에 Makefile을 잘 사용하지는 못하는데 커피스크립트로 원하는 로직을 만들어서 쉽게 실행할 수 있으니 작업을 자동화하기에 꽤나 편하군요.
2011/11/05 04:05 2011/11/05 04:05