Gruntfile의 구조와 사용법

Gruntjs를 사용한다고 하는것은 gruntfile.js를 다룰 줄 안다고 하는 것과 마찬가지로 gruntfile.js는 중요합니다. 중요하다고 해서 배우기가 어렵다는 말은 아닙니다.
개인의 차이는 있겠지만 보통 1~2일이면 개념을 이해 할 수 있고 1주일 정도면 구글링을 하면서 Gruntjs를 사용할 수 있을 정도로 어렵지 않습니다.

이전 포스팅에서 Gruntjs의 소개와 설치법을 작성했으니 완전 초보자이시면 이전 포스팅을 먼저 보는 것이 도움이 될것 같습니다.

gruntfile.js의 구조와 사용법

gruntfile.js의 가장 기본적인 구조는 아래와 같습니다.
1. 프로젝트의 구성, 2. 사용한 플러그인 로딩, 3. 실행 명령어의 3개의 분류로 구성되어 있으며 각각 영역별로 설명을 하도록 하겠습니다.

module.exports = function(grunt) {

  // 1. 프로젝트의 구성
  grunt.initConfig({

    // package.json의 정보를 불러옴
    pkg: grunt.file.readJSON('package.json'),

    // uglify 플러그인(패키지)의 옵션을 정의 함
    uglify: {
      build: {
        src: 'src/<%= pkg.name %>.js',
        dest: 'build/<%= pkg.name %>.min.js'
      }
    }

  });

  // 2. 사용한 플러그인 로딩(먼저 npm으로 설치를 해야 함) 
  grunt.loadNpmTasks('grunt-contrib-uglify');

  // 3. 실행 명령어 (명령창에서 grunt 명령으로 실행됨)
  grunt.registerTask('default', ['uglify']);

};

gruntjs사이트에서 발췌

1. 프로젝트의 구성

프로젝트의 구성은 module.exports = function(grunt) { ... } 로 javascript의 Function형태로 작성하고 모듈을 exports하여 외부에서 실행시킬 수 있게 되어 있습니다.

module.exports = function(grunt) {

};

▲ 예) gruntfile.js의 모든 내용은 위의 모듈 내에 작성을 해야 합니다. 위의 모듈내에 작성된 내용은 Node.js의 명령어창(주로 window의 Dos창)에서 명령어로 실행을 시킬 수 있습니다.

Tastk 구성 정의

grunt.initConfig({ ... }) 안에 사용할 Task(플러그인)들을 명시하고 옵션을 지정합니다. Task(플러그인)들의 작성 순서는 상관없이 없으며 설치된 각 Task(플러그인)을 어떻게 사용할지에 대한 구성을 정의 합니다. 예를들면, 원본파일은 어느 폴더에 있는 파일을 참조할지, 처리는 어떻게 할지, 그리고 처리하고 난 결과물은 어디 폴더에 저장 할지 등등.. 설정을 각 Task별로 정의를 합니다.

grunt.initConfig({ 

    // uglify 플러그인(패키지)의 옵션을 정의 함
    uglify: {
      build: {
        src: 'src/<%= pkg.name %>.js', // 소스폴더 위치
        dest: 'build/<%= pkg.name %>.min.js' // 결과를 저장할 폴더와 파일명
      }
    }

 })

▲ 여기서는 샘플로 uglify라는 Task(플러그인) 하나만 정의 했지만 실제로는 많은 플러그인들을 나열하여 정의합니다.

uglify 플러그인에 대해서 간단히 설명을 하면….

uglifyjavascript를 압축해 주는 플러그인입니다. 압축이라 함은 javascript 코드에서 빈공간과 줄바꿈, 주석 등.. 불필요한 모든 요소들을 제거해 줍니다. 그래서 결과 파일을 봤을 때는 소스코드가 그냥 한줄로 아주 길게 늘어져있는 코드만 보여 집니다.

uglifybuild를 실행시키면 src에 지정된 url에 있는 javascript파일 들에 대해서 모두 uglify처리를 합니다. 그리고 dest에 지정된 url에 결과 파일을 저장합니다. 보통은 같은 폴더 안에 .min을 붙혀서 저장하는 경우가 일반적입니다.

2. 사용한 플러그인 로딩

grunt.initConfig({ ... })에 지정한 플러그인들을 사용하기 위해서는 먼저 아래와 같이 플러그인을 불러와야 합니다. 사용한 모든 플러그인을 로딩 해야 합니다.
샘플에는 uglify만 사용했기 떄문에 grunt.loadNpmTasks('grunt-contrib-uglify');만 로드하면 되지만 그냥 샘플로 아래에 몇 개를 더 추가해 봤습니다. 이런식으로 사용한 플러그인들은 아래쪽으로 작성하여 로딩을 시켜줘야 합니다.

  grunt.loadNpmTasks('grunt-contrib-uglify');
  grunt.loadNpmTasks('grunt-contrib-imagemin'); // 이미지를 옵션에 따라 압축함
  grunt.loadNpmTasks('grunt-contrib-coffee'); // coffee 스크립트로 작성된 소스를 javascript로 변화시켜줌
  ...
참고로 플러그인 명이 **contrib**가 들어가 있는 것은 **Grunt Team**에서 제작한 것이므로 공신력이 있다고 보시면 됩니다.

3. 실행 명령어

플러그인을 정의 했고, 로딩을 했으면 마지막으로 플러그인들을 순서대로 실행시켜는 명령어 뭉치를 작성하애 합니다.
grunt.registerTask('default', ['']); 라는 명령어 뭉치로 작성을 한 후 명령어 창에 grunt 명령어를 실행시키면 지정된 순서대로 실행이 됩니다.
상황에 따라 여러개의 명령어 뭉치를 작성해놓고 골라서 실행시켜도 됩니다.

  grunt.registerTask('serve', [
    'uglify',
    'imagemin',
    'coffee'
  ]);
  ...

▲ 명령어 창에 grunt serve라는 명령어를 입력했을 때, 먼저 uglify가 실행되고 두번쨰로 imagemin가 실행되고 세번쨰로 coffee가 자동으로 실행됩니다.

  grunt.registerTask('build', [
    'coffee'
    'uglify',
    'imagemin',
  ]);
  ...

▲ 명령어 창에 grunt build라는 명령어를 입력했을 때, 먼저 coffee가 실행되고 두번쨰로 uglify가 실행되고 세번쨰로 imagemin가 자동으로 실행됩니다.

  grunt.registerTask('default', [
    'imagemin',
    'coffee'
    'uglify',
  ]);
  ...

▲ 명령어 창에 grunt라는 기본 명령어를 입력했을 때, 먼저 imagemin가 실행되고 두번쨰로 coffee가 실행되고 세번쨰로 uglify가 자동으로 실행됩니다.

다음 포스팅에는 Gruntfile.js주요 플러그인에 대해서 소개하도록 하겠습니다.

Similar Posts

  • 구글 크롬을 초기화 하는 방법

    구글 크롬을 오래 사용하다 보면 속도가 느려지거나 프리징이 되버리거나 하는 경우가 종종 있습니다. 이럴때 스마트폰을 공장초기화 하듯이 크롬도 초기화를 할 수 있는데요. 재설치가 아니고 크롬이 있는상태에서 초기화 하는 방법을 포스팅하려고 합니다. 모두 다 사라지는 것은 아니고 북마크는 남아 있으니 안심하시면 됩니다. 크롬 초기화 하기 브라우저의 우측 상단에 있는 설정메뉴 버튼을 클릭합니다. 컨텍스트메뉴 중 하단에 있는 […]

  • Angular에서 사용되는 타입스크립트 문법

    타입스크립트에 대한 간단한 문법을 정리하려고 합니다. 타입과 문자열 선언자 var : javascript에서 전통적으로 사용해온 선언자로 모든 타입을 허용 let : typescript에서 특화시킨 선언자로 타입을 지정해야 함 배열타입 배열의 타입을 아래와 같이 설정하며 배열에 값을 입력할때는 push()를 사용함 let fruits: string[] = [“바나나”,”사과”,”오렌지”]; let num1:Array = [1,2,3]; let num2:Array = new Array(); num2.push(1); num2.push(2); num2.push(3); 유니언타입 […]

  • 스마트폰으로 시놀로지 VPN 서버에 접속하기

    이전에 시놀로지 VPN 서버와 VPN PLUS은 무엇이 다른것인가 라는 제목으로 시놀로지로 VPN 서버를 만드는 것을 포스팅 했었습니다. 이번엔 이 VPN서버에 스마트폰으로 어떻게 접근하여 사용하는지 포스팅하려고 합니다. 제 폰이 안드로이드이기 떄문에 안드로이드폰을 기준으로 설명을 드릴 예정이며 아이폰이나 기타 다른폰 일지라도 핵심 설정은 거의 대동소이하므로 참고하실 수 있을 것입니다. 스마트폰으로 VPN PPTP 추가하기 PPTP가 무었인지는 시놀로지 VPN […]

  • node.js로 Youtube 다루기

    Youtube가 무엇인지는 따로 설명하지 않아도 대부분의 사람들이 알것이라고 생각합니다. 이 youtube도 구글에서 OpenAPI를 제공하고 있어서 Node.js에서 활용을 할 수 가 있습니다. 동영상을 업로드하거나 업데이트하거나 또는 검색어를 통해 리스트를 받아볼 수도 있습니다. 이런기능을 잘 활용하면 유의미한 APP을 개발할 수 있습니다. 이번 포스팅에서는 간단하게 Youtube Data API를 활용하여 원하는 검색어로 검색을 하는 일련의 과정을 작성하도록 하겠습니다. 0.1. […]

  • 시놀로지 NAS의 Docker로 STRAPI설치하기

    시놀로지 NAS는 개발자에게 축복과도 같은 장비입니다. 일반 사용자처럼 사진의 관리나 파일의 관리를 개인용 클라우드처럼 사용할 수 도 있지만 DSM을 활용한다면 다양한 용도로 사용할 수 있기 때문입니다. 더욱이 Docker을 활용한다면 웬만한 Toy프로젝트나 개발용 프로젝트 정도는 쉽게 구현할 수 있습니다. 이번에 STRAPI라는 오픈소스 프로그램에 흥미가 생겨서 시놀로지의 Docker을 활용하여 설치 해보려고 합니다. STRAPI는 아주 쉽게 Restfull 또는 […]

  • 포토스케이프(PhotoScape X) 100% 활용 하기

    사진이나 이미지를 다룰 때 포토샵을 뺴놓으면 섭하지만 이 포토샵의 가격이 후덜덜 하고 또한 클라우드로 변경되면서 가격은 좀 싸졌을지 모르지만 매년 또는 매달 비용을 지불해야 하는 부담감이 있습니다. 이걸 가지고 돈을 벌 수 있는 직업이 있다면 그런대로 투자할 만 한데 그렇지 않은 일반 개인이나 서민들은 해적판이나 대체 프로그램을 찾기 마련입니다. 여러가지 다양한 사진 다루는 툴이 있겠지만 […]

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다