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 ๋ผ๋Š” ์••์ถ•๋œ ํŒŒ์ผ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.