Outsider's Dev Story

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

grunt-init의 템플릿 설정하기

이전에 Grunt 0.3.x에 포함된 init 기능을 사용해서 템플릿을 정의하는 방법을 포스팅했었는데 grunt가 0.4로 업그레이드되면서 init기능이 grunt-init이라는 별도의 모듈로 변경되었다. 0.4에서 Grunt의 아키텍쳐를 새로 정리하면서 다른 기능과는 전혀 의존성이 없고 빌드도구와 별도의 용도인 init기능이 분리된 것은 바람직한 현상이라고 생각한다. 기존에 작성해놨던 템플릿을 grunt-init으로 변경하면서 달라진 내용들을 정리해 본다. 자세한 내용은 Project Scaffolding문서에 잘 나와있다.


설치
일반적인 CLI용 npm 모듈이므로 다음과 같이 설치한다.

$ npm install -g grunt-init

설치가 완료되면 커맨드라인에서 다음과 같이 grunt-init 명령어를 사용할 수 있다.

$ grunt-init  --version
grunt-init v0.2.0
grunt v0.4.0


스캐폴딩용 템플릿 추가하기
Grunt 0.3.x에서는 init기능에 기본으로 들어있는 몇가지 템플릿이 있었지만 grunt-init에서는 기본으로 내장된 템플릿은 존재하지 않는다. ~/.grunt-init 폴더(윈도우라면 사용자폴더/.grunt-init)가 템플릿을 보관하는 폴더이다.(0.3.x에서는 .grunt/tasks/init/ 아래에 템플릿을 두었다.) ~/.grunt-init 폴더아래 템플릿별로 폴더를 하나씩 만들어서 넣으면 된다. 예를 들어 example이라는 템플릿을 만든다면 ~/.grunt-init/example라는 폴더를 만들고 모든 파일을 example폴더 안에 넣는다.(0.3.x에서는 .grunt/tasks/init/아래 example.js와 example 폴더가 모두 존재해야 했다.) 메인폴더는 항상 template.js파일이 되고 파일변경에 대한 규칙은 rename.json에 정의한다. 실제 템플릿이 되는 파일은 기존과 동일하게 root폴더(여기서는 ~/.grunt-init/example아래)에 넣는다.

메인 파일인 template.js에서는 기존과 달라진 점은 많지 않다. 템플릿의 설명과 안내문구를 추가하는 부분은 exports.descriptionexports.notes를 그대로 사용하고 템플릿으로 파일을 추가할 기본 현재 폴더에 이미 파일이 존재할 경우에 경고문구를 보여주기 위해서 사용하는 exports.warnOn도 그대로 사용한다. exports.warnOn에서는 검사할 파일패턴(혹은 파일패턴의 배열)을 지정하면 된다. exports.warnOn에 지정한 파일이 존재할 경우에는 템플릿에서 스캐폴딩을 추가하지 않고 --force옵션을 사용해야만 스캐폴딩을 생성한다.

exports.template = function(grunt, init, done) {
  grunt.helper('prompt', {}, [], function(err, props) {});
};

grunt 0.3.x에서는 위와 같이 템플릿을 작성했다면 grunt-init에서는 다음과 같이 작성한다.

exports.template = function(grunt, init, done) {
  init.process({}, [], function(err, props) {});
};

init.processinit.process(options, prompts, done)의 시그니처를 가지고 있고 prompts인자에서는 템플릿을 생성하는데 사용할 설정값을 프롬프트에서 입력받는 내용을 설정한다.

{
  name: 'hasLicense',
  message: 'Do you add license file?',
  default: 'Y/n'
},
init.prompt('licenses'),
init.prompt('author_name')

기존과 동일하게 JSON 리터럴로 사용할 수도 있고 간단히 init.prompt(name[, default]);로 추가할 수도 있다. 문서에 나온대로 내장된 prompt값들이 존재하고 있다. 프롬프트에서 자주 사용하게 되는 값은 기본값으로 지정해 놓을 수도 있는데 이는 ~/.grunt-init/아래에 defaults.json 파일에서 지정해 놓으면 프롬프트에서 해당이름의 기본값으로 사용한다. 0.3.x에서 내장되어 있던 init 템플릿들은 별도로 관리되기 때문에 grunt 저장소에서 grunt-init-*로 시작하는 템플릿을 ~/.grunt-init/아래에 추가하면 된다.



0.3.x에서는 문서화가 엉망이라서 템플릿을 작성하는데 어려움이 꽤 있었는데 기존에 작성해 본적이 있다면 이정도만으로도 grunt-init에 맞게 수정할 수 있었고 이제는 문서가 어느 정도 제공되므로 좀 더 다양한 API를 사용해서 템플릿을 작성할 수 있을 것으로 보인다. 추가적으로 나는 언어별 반복적으로 생성하게 되는 기본 프로젝트 파일들이나 git파일, 정적 파일들을 템플릿으로 만들어서 사용하고 있다.
2013/02/27 02:46 2013/02/27 02:46