Grunt은 Javascript Task Runner 입니다.. 이 문서는 Grunt 공식 사이트의 Create tasks를 번역한 문서이며 grunt-cli의 버전이 0.1.11일 때 번역했습니다.
Create tasks
Task는 Grunt의 존재 이유이자 가장 중요한 개념이다. 여러분이 하는 대부분의 일(task)은 jshint나 nodeunit같은 것들이다. 실행할 Task를 하나 이상 명시해서 Grunt에게 하고 싶은 일이 무엇인지 알려주면, Grunt가 그 일을 매번 실행한다.
여러분이 task를 새로 명시하지 않았고, “default”란 이름의 task가 이미 정의되어 있다면, 기본값으로 그 task가 실행된다.
Alias Tasks
다음처럼 새로운 task에 다른 task 명단을 명시하면, 그 신규 task의 이름은 여러 task들을 대표하는 별명(alias)이 된다. 이런 “alias task”가 실행될 때면, taskList에 명시한 모든 task들이 순서대로 실행된다. 이때 taskList 전달인자는 배열이다.
Multi-task로 만든 task는 실행될 때, Grunt 환경 설정 객체에서 동명의 프로퍼티를 찾는다. 또한 multi-task는 적절한 target(task의 하위 개념) 명으로 각자의 환경설정을 가질 수 있다.
grunt concat란 컴멘드가 그 안의 모든 target를 순회하는 반면에, grunt concat:foo나 grunt concat:bar처럼 task와 target까지 지정하면, 특정 target의 환경설정만 가져온다. 이때 grunt.task.renameTask로 이름을 변경하면, 바꾼 task 명으로 환경 설정을 찾는다.
grunt foo:testing:123를 입력하면 foo, testing 123가 콘솔에 출력된다. grunt foo처럼 아무 인자도 넘기지 않고 실행하면 foo, no args가 콘솔에 찍힌다.
1234567
grunt.registerTask('foo','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);}});
Custom tasks
만들려는 Task가 “multi-task” 구조를 따르지 않는다면 기본 task형태로 사용자 정의 task를 만들자.
123
grunt.registerTask('default','My "default" task description.',function(){grunt.log.writeln('Currently running the "default" task.');});
task 안에서 다른 task를 실행할 수 있으며,
123456
grunt.registerTask('foo','My "foo" task.',function(){// "bar"와 "baz" task가 "foo" 가 끝난 후에 순서대로 실행하려고 대기중이다. grunt.task.run('bar','baz');// 이렇게 적어도 된다. grunt.task.run(['bar','baz']);});
비동기도 가능하다.
1234567891011
grunt.registerTask('asyncfoo','My "asyncfoo" task.',function(){// task를 비동기 모드로 만들고 "done" 함수로 제어한다. vardone=this.async();// 동기 작업을 실행한다. grunt.log.writeln('Processing task...');// 그리고 비동기 작업을 실행한다. setTimeout(function(){grunt.log.writeln('All done!');done();},1000);});
grunt.registerTask('foo','My "foo" task.',function(){if(failureOfSomeKind){grunt.log.error('에러 메세지');}// task 실행 중 에러가 있다면 false를 반환해서 실패 처리한다.if(ifErrors){returnfalse;}grunt.log.writeln('성공 메세지');});
Task는 다른 task가 성공적으로 실행되었는지 여부와 관련지을 수도 있다. grunt.task.requires는 실제로 다른 task를 실행하지는 않지만, 그 task가 실행되었는지, 실패는 없었는지를 확인한다.
12345678910111213141516
grunt.registerTask('foo','My "foo" task.',function(){returnfalse;});grunt.registerTask('bar','My "bar" task.',function(){// "foo" task가 실패했거나 실행된적이 없다면, 이 task를 실패 처리한다. grunt.task.requires('foo');// 이 코드는 "foo" task가 성공적으로 실행된 적이 있을 때만 실행된다. grunt.log.writeln('Hello, world.');});// 사용법// grunt foo bar// foo가 실패하는 task이므로 로그는 출력되지 않는다. // grunt bar// foo가 실행된적이 없으므로 로그는 출력되지 않는다.
grunt.config.requires를 사용하면, Task가 존재하지 않는 환경설정 프로퍼티를 요구할 때, 실패 처리할 수 있다.
12345678
grunt.registerTask('foo','My "foo" task.',function(){// "meta.name" 란 환경설정 프로퍼티가 없으면 이 타스트를 실패 처리한다. grunt.config.requires('meta.name');// 이경우도 "meta.name" 환경설정 프로퍼티가 없다면, 실패한다. grunt.config.requires(['meta','name']);// 조건이 충족되어야 로그가 출력된다. grunt.log.writeln('meta.name이 환경설정에 정의되어있을 때만 로그가 출력된다.');});
환경설정 프로퍼티에는 grunt.config로 접근할 수 있다.
123456
grunt.registerTask('foo','My "foo" task.',function(){// 프로퍼티 값을 로그로 출력한다. 프로퍼티가 undefined이면 null을 반환한다. grunt.log.writeln('The meta.name property is: '+grunt.config('meta.name'));// 이경우도 프로퍼티 값을 로그로 출력한다. 프로퍼티가 undefined이면 null을 반환한다. grunt.log.writeln('The meta.name property is: '+grunt.config(['meta','name']));});