Grunt의 API를 사용하여 Task를 만들어 보자. Grunt의 Task가 핵심으로 한개를 수행하거나 여러개를 동시에 수행할 수도 있다.
1) Task 별칭 등록하기
- grunt.registerTask 로 Task의 별칭을 지정한다
+ api : grunt.registerTask(taskName, taskList)
+ 예 : task.registerTask('default', 'lint qunit concat min');
+ grunt 수행시 특정 task를 지정하지 않으면 자동으로 default 별칭의 task가 수행된다
2) Function Task 만들기
- grunt.regiterTask 로 Task를 신규로 만들 수 있다
+ api : grunt.registerTask(taskName, description, taskFunction)+ description, taskFunction을 파라미터로 넘기면 새로운 task 등록됨
+ fail이 나면 return false 를 해야 한다
////////////////////////////////////////////// // grunt.js 환경파일에 등록한다 grunt.registerTask('dowon', 'A sample task that logs stuff.', function(arg1, arg2) { if (arguments.length === 0) { grunt.log.writeln(this.name + ", no args"); } else { grunt.log.writeln(this.name + ", " + arg1 + " " + arg2); } }); ////////////////////////////////////////////// // 결과 // 아규먼트 없을 때 D:\Development\testing_grunt>grunt.cmd dowon Running "dowon" task dowon, no args Done, without errors. // 아규먼트 전달 : 이용 D:\Development\testing_grunt>grunt.cmd dowon:hello:youngsik Running "dowon:hello:youngsik" (dowon) task dowon, hello youngsik Done, without errors.
3) Multi Task 만들기
- grunt.registerMultiTask 를 이용하여 만든다
+ api : grunt.registerMultiTask(taskName, description, taskFunction)
+ lint, concat, min task등이 multi task이다
+ sub-properties (별칭 targets) 이 내부적으로 task가 된다
+ multi task에서는 function에서 특별히 this 키워드를 사용하여 접근한다
- grunt.initConfig 안에 target을 만든다 객체명칭 = multi task의 대표 명칭이다
+ 하기 예제에서 logstuff 가 multi task의 대표명칭이다
+ grunt.registerMultiTask의 첫번째 아규먼트인 multi task 명칭을 logstuff 로 일치시킨다
+ 등록한 function에서 this 함에 주의*
////////////////////////////////////////////// /*global config:true, task:true*/ grunt.initConfig({ logstuff: { foo: [1, 2, 3], bar: 'hello world', baz: false } }); grunt.registerMultiTask('logstuff', 'This task logs stuff.', function() { // this.target === the name of the target // this.data === the target's value in the config object // this.name === the task name // this.args === an array of args specified after the target on the command-line // this.flags === a map of flags specified after the target on the command-line // this.file === file-specific .src and .dest properties // Log some stuff. grunt.log.writeln(this.target + ': ' + this.data); // If data was falsy, abort!! if (!this.data) { return false; } grunt.log.writeln('Logging stuff succeeded.'); }); ////////////////////////////////////////////// // 결과 // target을 지정하지 않았을 때는 전체 target이 수행 D:\Development\testing_grunt>grunt.cmd logstuff Running "logstuff:foo" (logstuff) task foo: 1,2,3 Logging stuff succeeded. Running "logstuff:bar" (logstuff) task bar: hello world Logging stuff succeeded. Running "logstuff:baz" (logstuff) task baz: falseTask "logstuff:baz" failed. Use --force to continue. Aborted due to warnings. // foo target을 지정 D:\Development\testing_grunt>grunt.cmd logstuff:foo Running "logstuff:foo" (logstuff) task foo: 1,2,3 Logging stuff succeeded. Done, without errors. // bar target을 지정 D:\Development\testing_grunt>grunt.cmd logstuff:bar Running "logstuff:bar" (logstuff) task bar: hello world Logging stuff succeeded. Done, without errors. // baz target에서 false return하면서 warning 발생함 D:\Development\testing_grunt>grunt.cmd logstuff:baz Running "logstuff:baz" (logstuff) task baz: falseTask "logstuff:baz" failed. Use --force to continue. Aborted due to warnings.
4) Init Task 만들기
- api : grunt.registerInitTask(taskName, description, taskFunction)
+최초에 수행되는 init task를 수행하고 별도의 환경 설정 데이터도 필요없다
5) Task명칭 바꾸기
- api : grunt.renameTask(oldname, newname)
6) Inside Tasks 알아보기
- grunt의 this 에는 여러 유용한 properties 와 method를 가지고 있다. grunt.task.current 로 expose 한다
- Task에서 구현하는 function에서 사용한다
- this.async / grunt.task.current.async
+ task를 비동직적으로 수행시켜 준다
////////////////////////////////////////////// // Tell grunt this task is asynchronous. var done = this.async(); // Your async code. setTimeout(function() { // Let's simulate an error, sometimes. var success = Math.random() > 0.5; // All done! done(success); }, 1000);
- this.requires / grunt.task.current.requires : 의존관계있는 task를 열거
- this.requiresConfig / grunt.task.current.requiresConfig : config properties 열거
- this.name / grunt.task.current.name : 등록된 task 명칭
- this.nameArgs / grunt.task.current.nameArgs : grunt뒤의 아규먼트들 예) grunt.cmd task1:foo -> task1:foo
- this.args / grunt.task.current.args : task명칭을 뺀 실제 아규먼트값을 배열로 리턴
- this.flags / grunt.task.current.flags : 아규먼트를 만들어준다
- this.errorCount / grunt.task.current.errorCount : task에서 발생한 에러건수
7) Indside Multi Tasks 알아보기
- this.target / grunt.task.current.target : multi task에서만 사용. config data로 등록된 key (name) 값
- this.data / grunt.task.current.data : multi task에서만 사용. config data로 등록된 value 값
- this.file / grunt.task.current.file : compact format 사용시 this.file.src , this.file.dest 가 만들어진다 (template api 참조)
8) 외부에서 정의된 Task 로딩하기
- 큰 프로젝트에서 sub 프로젝트끼리 공유하기 위하여 task와 helper 들을 만든다
- 여러 디렉토리에서 task를 로딩하거나 또는 Npm-installed grunt plugin 을 로딩한다
- task 관련 파일들 로딩하기
+ api : grunt.loadTasks(tasksPath)
- task와 helper 로딩하기
+ api : grunt.loadNpmTasks(pluginName)
- npm module 호출
+ api : grunt.npmTasks(npmModuleName)
9) Helper 정의하고 실행하기
- 이미 만들어지 helper들 존재 (참조)
- helper 만들기
+ api : grunt.registerHelper(helperName, helperFunction)
////////////////////////////////////////////// grunt.registerHelper('add_two_nums', function(a, b) { return a + b; });
- helper 이름 바꾸기
+ api : grunt.renameHelper(oldname, newname)
- helper 호출하기
+ api : grunt .helper(helperName, [, agruments...])
10) Warning 과 Fatal Error
- api 호출하여 화면에 출력 한다
- grunt.warn(error [, errorCode])
- grunt.fatal(error [, errorCode])
<참조>
'Dev Environment > Build System' 카테고리의 다른 글
[Yeoman] 자신만의 Generator 만들기 - 1 (0) | 2013.04.25 |
---|---|
[Yeoman] generator-angular 와 Express.js 연동하기 (0) | 2013.04.22 |
[Yeoman] AngularJS 개발환경 자동 구성하기 (3) | 2013.04.15 |
[Grunt] Javascript code using Grunt.js (0) | 2013.01.28 |
[Grunt] Javascript code using Ant (0) | 2013.01.28 |