gulp - MoonGyeongHyeon/Keyword_Study GitHub Wiki
gulp
gulp๋?
gulp๋ steaming build system์ ํ๋ฐฉํ๋ค. ์ฆ, node์ ์คํธ๋ฆผ ๊ธฐ๋ฅ์ผ๋ก ์ธํด ์ด๋์ ์ป๋ ๋น๋ ์์คํ ์ด๋ ์๋ฏธ์ด๋ค. ๋น๋ ์์คํ ์ ํ๋ก์ ํธ๋ฅผ development, production, testing ๋ฑ์ ๋ค๋ฅธ ๋น๋๋ค๋ก ๋น๋ํด์ค๋ค. gulp๋ ์ด๋ฐ ์์ ์ ์ ๋๋ก ์ํํด์ฃผ๊ณ ๋ ํ๋ฌ๊ทธ์ธ๋ค์ ํตํด ๋งค์ฐ ํ์ฅ์ฑ์๊ฒ ์์ ํ ์ ์๋๋ก ๋์์ค๋ค.
๋ง์ฝ ํ๋ก์ ํธ๋ฅผ ์ด์(production)์ผ๋ก ๋น๋ํ๋ค๋ฉด, ์๋ง๋ javascript๋ฅผ minify ํ๊ณ ๋ sassํ์ผ์ ์ปดํ์ผํ๊ณ ์ฝ๋์ ์ค๋ฅ๋ ์๋์ง ์ฒดํฌํ๊ณ ์ถ์ ๊ฒ์ด๋ค. ์ด๋ฐ๊ฑธ ์ง์ ์๋์ผ๋ก ํ ์๋ ์์ง๋ง 'gulp task'๋ฅผ ์์ฑํด์ ์๋ํํ ์๋ ์๋ค.
gulp ์ธํ ํ๊ธฐ
npm์ ์ด์ฉํ์ฌ gulp๋ฅผ ์ค์นํด๋ณด๋๋ก ํ์.
$ npm install gulp -g
$ npm install gulp --save-dev
--save-dev ์ต์ ์ ์ถ๊ฐํ๋ฉด ๋ํ๋์๋ค์ devDependency๋ก๋ง ์ค์นํ๊ฒ ๋๋๋ฐ, ์ด ์ต์ ์ ์ฃผ๋ ์ด์ ๋ gulp์ ๊ด๋ จ ๋ํ๋์๋ค์ ์ดํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ ๊ณผ์ ๊น์ง๋ง ํ์ํ๊ธฐ ๋๋ฌธ์ด๋ค. gulp ํ๋ก๊ทธ์ธ๋ค์ ์ค์นํ ๋๋ ๊ฐ์ --save-dev ์ต์ ์ ์ฃผ๋๋ก ํ์.
$ npm install gulp-[plugin name] --save-dev
ํด๋ ๊ตฌ์กฐ
๋จผ์ , src ํด๋์ dist(distribution) ํด๋๋ฅผ ๋ง๋ค์. src ํด๋๋ ์๋ฌด๋ฐ ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์ javascript์ ์์ถํ์ง ์์ css, ์ต์ ํํ์ง ์์์ด๋ฏธ์ง๋ค์ด ๋ค์ด๊ฐ๊ฒ ๋๋ค. dist ํด๋๋ gulp์ ์ํด ๋น๋๋ ํ์ผ๋ค์ด ๋ค์ด๊ฐ๊ฒ ๋ ๊ฒ์ด๋ค. ๋ฃจํธ ๋๋ ํ ๋ฆฌ๋ฅผ ๊นจ๋ํ๊ฒ ์ ์งํ๊ธฐ ์ํด /public ์ด๋ผ๋ ํด๋ ์๋ src์ dist ํด๋๋ฅผ ๋์. ๊ทธ๋ผ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๊ฐ ๋ ๊ฒ์ด๋ค.
node_modules/
public/
src/
index.html
img/
js/
scss/
dist/
index.html
img/
js/
css/
lib/
vanilla.js
fancybox.js
gulpfile.js
package.json
gulpfile.js
์ด ํ์ผ์ gulp์ ์ค์ ์ด ๋ด๊ฒจ์ง๊ฒ ๋๋ค. gulp์ ๋ฌธ๋ฒ์ด ์๊ธด ํ์ง๋ง ๋งค์ฐ ์ฝ๊ณ ๋ค๋ฃจ๊ธฐ ์ข๋ค. ์๋๋ ๊ทธ ๋ฌธ๋ฒ์ด๋ค.
var gulp = require('gulp');
var concat = require('gulp-concat');
//...
gulp.task('combine-js', ['lint-js'], function () {
return gulp.src('/public/js/**/*.js')
.pipe(concat('all.js'))
.pipe(gulp.dest('public/dist/js'));
});
//...
gulp.task('default', ['combine-js']);
ํ๋ํ๋ ๋ณด๋๋ก ํ์.
gulp.task(name, deps, func)
gulp.task๋ก gulp task๋ฅผ ์ ์ธํ๊ฒ ๋๋๋ฐ, ์ฌ๊ธฐ์ 3๊ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ํฌํจํ๋ฉฐ ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ ์๋ตํ ์ ์๋ค.
- name: task์ ์ด๋ฆ์ ์ง์ ํ๋ฉฐ, ์ด๋ฆ์๋ ๊ณต๋ฐฑ์ด ํฌํจ๋์ ์๋๋ค.
- deps: ํ์ฌ ์ ์ธํ๊ณ ์๋ task๋ฅผ ์ํํ๊ธฐ ์ ์ ๋จผ์ ์คํ๋์ด์ผ ํ๋ task๋ค์ ๋ฐฐ์ด์ด๋ค. ์์ ์์ ์์๋ javascript ํ์ผ์ ๋ณํฉํ๋ task๋ฅผ ์งํํ๊ธฐ ์ ์ javascript lint๋ฅผ ๋จผ์ ์ํํ๋๋ก ๋์ด์๋ค.
- func: ์ค์ ์ํํ task์ ๋ด์ฉ์ ์ ์ํ๋ function์ด๋ค.
๋ง์ฝ ์ ํ๋์ด์ผ ํ task๊ฐ ์๋ค๋ฉด gulp.task('name', [], fn);
๊ณผ ๊ฐ์ด ํ๋ฉด ๋๋ค. ๋ฌผ๋ก , gulp.task('name', fn);
์ผ๋ก ํด๋ ์๊ด์๋ค.
gulp.src(files)
gulp.src(files)๋ ํ์ผ์ด๋ ํ์ผ์ ๊ฒฝ๋ก๋ค์ด ํฌํจ๋ ๋ฐฐ์ด ๋๋ string์ด๋ค.
์ ์์ ์์๋ '/public/js/**/*.js'๋ก ๋์ด์๋๋ฐ, ์ด๋ ๊ฒ ์์ผ๋์นด๋ ํํ๋ก ํํํ ์๋ ์๋ค. ์๋๋ฉด ๋ฐฐ์ด ํํ๋ก ์ฌ๋ฌ ํ์ผ๋ค๊ณผ ํด๋๋ฅผ ๊ธ์ด์ฌ ์๋ ์๋ค.
gulp.src([
'public/src/js/loginForm.js'
'public/src/js/slider/*.js'
'!public/src/js/slider/slider-beta.js'
] ...);
์์ ์์์๋ 'loginForm.js' ํ์ผ๊ณผ slider ํด๋ ์์ ๋ชจ๋ .js ํ์ผ์ ๊ธ์ด์ค๊ฒ ๋๋ค. ๋งจ ์์ '!' ํ์๊ฐ ๋์ด์๋ ๊ฒ์ ํด๋น ํ์ผ์ ํฌํจํ์ง ๋ง๋ผ๋ ๋ป์ด๋ค. ๋จ, ๋ฐ๋ก ์์ ํด๋น ํ์ผ์ ํฌํจํ๊ณ ์์ ๋๋ง ์ฌ์ฉํด์ผ ํ๋ค.
gulp.pipe(...)
pipe๋ฅผ ์ฌ์ฉํด์ task๋ค์ ๊ฒฐ๊ณผ๋ฌผ์ function๋ค์๊ฒ ์ ๋ฌํ ์ ์๋ค. ์ข ๋ ์์ธํ ๋ณด์.
gulp.src('public/src/js/*.js')
.pipe(stripDebug())
.pipe(uglify())
.pipe(concat('script.js'))
.pipe(gulp.dest('public/dist/js'));
์ด ์์ ๋ stripDebug, uglify, concat์ ์ฌ์ฉํ๋ค.
๋จผ์ , gulp๋ public/src/js ํด๋์ ๋ชจ๋ js ํ์ผ๋ค์ ๊ธ์ด์จ๋ค. ๊ทธ๋ฐ ๋ค์, ์ฐ๋ฆฌ๋ ๊ทธ๊ฑธ stripDebug์๊ฒ๋ก ํ์ดํํด์ฃผ๊ฒ ๋๋๋ฐ, stripDebug๋ ๋ชจ๋ console.log ๋ค๊ณผ alert ๋ค์ ์ ๊ฑฐํด์ค๋ค. ๊ทธ ๋ค์์ผ๋ก uglify๋ก ํ์ดํํด์ฃผ๊ฒ ๋๋๋ฐ, uglify๋ javascript๋ฅผ ์์ถํด์ค๋ค. ๊ทธ ํ์ ์ฐ๋ฆฌ๋ ์ด ํ์ผ๋ค์ concat('script.js')๋ก ํ์ดํํด์ฃผ๋๋ฐ, ์ด๊ฑด console.log์ alert๋ค์ด ์ ๊ฑฐ๋๊ณ ์์ถ๋ ๋ชจ๋ ํ์ผ๋ค์ script.js ํ์ผ ํ๋๋ก ๋ณํฉํด์ค๋ค. ๋ง์ง๋ง์ผ๋ก ์ฐ๋ฆฌ๋ ์ด ํ์ผ์ gulp.dest๋ก ๋ณด๋ด๊ฒ ๋๋๋ฐ, ์ด๋ฅผ ํตํด ์ฐ๋ฆฌ๊ฐ ์ค์ ์ฌ์ฉํ๊ฒ ๋ output ํ์ผ๋ก ์ฐ์ฌ์ง๋ค.
๋ถํ์ํ ์ฝ์ ๋ก๊ทธ๊ฐ ์ ๊ฑฐ๋๊ณ ์์ถ๋ ํ๋์ js ํ์ผ์ ์ป์๋ค.(public/dist/js/script.js)
gulp.task('default', []);
gulp.task('default', [])๋ command-line์์ ์๋ฌด๋ฐ argument ์์ด gulp๋ฅผ ์คํํ์ ๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์คํ๋๋ task์ด๋ค. ๋ง์ฝ ํน์ task๋ฅผ ์คํํ๊ณ ์ถ๋ค๋ฉด ์๋์ ๊ฐ์ด ํ ์ ์๋ค.
$ gulp task-name
gulpfile ๋น๋ํ๊ธฐ
์ด์ gulpfile์ด ๋๋ต ์ด๋ค ๊ตฌ์กฐ์ธ์ง ์๊ฒ๋์๋ค. ์ด์ ์ค์ ๋ก gulpfile์ ์์ฑํด๋ณด์. dist์ src ํด๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ๊ณ ์๋ค๊ณ ๊ฐ์ ํ๊ฒ ๋ค. ์ด ์์ ์์๋ ํ์ผ์ด ๋ณ๊ฒฝ๋์์ ๊ฒฝ์ฐ, javascript ํ์ผ ๋ณํฉ/์์ถ ๋ฐ sass ํ์ผ์ ์ปดํ์ผํ ๋ค ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ฆฌ๋ก๋ํ๋ gulpfile์ ์์ฑํ ๊ฒ์ด๋ค.
์ด๋ฅผ ์ํด ์ฐ๋ฆฌ๋ ์๋ฆฌ์ ๊ฐ์ gulp-plugins๊ฐ ํ์ํ๋ค. (์์์ ์ด์ผ๊ธฐํ ๊ฒ์ฒ๋ผ gulp์์ ์ฌ์ฉ๋๋ ํ๋ฌ๊ทธ์ธ๋ค์ devDependencies๋ก ๋จผ์ ์ค์นํด์ฃผ์ด์ผ ํ๋ค.)
gulp-webserver: ์น์๋ฒ์ฒ๋ผ ๋์ํ๊ฒ ํ๋ ํ๋ฌ๊ทธ์ธ.
gulp-concat: js ํ์ผ ๋ณํฉ์ ์ํ ํ๋ฌ๊ทธ์ธ.
gulp-uglify: js ํ์ผ ์์ถ์ ์ํ ํ๋ฌ๊ทธ์ธ.
gulp-minify-html: html ํ์ผ minify๋ฅผ ์ํ ํ๋ฌ๊ทธ์ธ
gulp-sass: sass ํ์ผ์ ์ปดํ์ผํ๊ธฐ ์ํ ํ๋ฌ๊ทธ์ธ.
gulp-livereload: ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ฆฌ๋ก๋ํ๊ธฐ ์ํ ํ๋ฌ๊ทธ์ธ.
ํ๋ก์ ํธ ๋ฐ์ gulpfile.js ํ์ผ์ ์์ฑํ๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ํ ํ๋ฌ๊ทธ์ธ๋ค์ includeํ๋๋ก ํ๋ค.
var gulp = require('gulp');
var concat = require('gulp-concat');
var uglify = require('gulp-uglify');
๊ฒฝ๋ก๋ฅผ ๊ฐ์ฒด์ ๋ด์๋๊ณ ์ฌ์ฉํ๋ฉด ์ ์ง๋ณด์๊ฐ ํธํด์ง๋ค.
var src = 'public/src';
var dist = 'public/dist';
var paths = {
js: src + '/js/*.js',
scss: src + '/scss/*.scss',
html: src + '/**/*.html'
};
๋ง์ง๋ง์ผ๋ก, ์ค์ task๋ค์ ์์ฑํ๋ค.
gulp.task('concat', function () {
return gulp.src(paths.js)
.pipe(uglify())
.pipe(concat('combined.js'))
.pipe(gulp.dest(dist + '/js'))
});
gulp.task('default', [ 'concat' ]);
command-line์์ 'gulp' ๋๋ 'gulp concat' ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด public/dist/js ํด๋์ combined.js ๋ผ๋ ์์ถ๋ ํ์ผ์ ํ์ธํ ์ ์๋ค.