ã¯ããã«
Gruntãããªãã«ãšã£ãŠæ°ããèšèã§ãããªããæåã«Chris Coyers ã®èšäºãGruntã®ãããªãã®ã¯ããŠéããšæã人ã ã®ããã®Gruntããèªãããšãã§ããŸãã ã¯ãªã¹ããã®çŽ¹ä»ã®åŸãããªãã¯ããªãèªèº«ã®Gruntãããžã§ã¯ããæã¡ãGruntãç§ãã¡ã«æäŸãããã¹ãŠã®æ©äŒããã§ã«å³ãã£ãŠããã§ãããã
ãã®èšäºã§ã¯ãGruntã®å€æ°ã®ãã©ã°ã€ã³ããããžã§ã¯ãã«è¿œå ããã®ã§ã¯ãªããã¢ã»ã³ããªèªäœãäœæããããã»ã¹ã«çŠç¹ãåœãŠãŸãã Gruntã§ã®äœæ¥ã®æ¬¡ã®åŽé¢ã§å®è·µçãªã¹ãã«ãç¿åŸããŸãã
- gruntfileãæŽçæŽé ããæ¹æ³
- ãã«ãæéãå€§å¹ ã«æ¹åããæ¹æ³
- ãã«ãã¹ããŒã¿ã¹ã«é ããªãããã«ããæ¹æ³
åæ çãªäœè«ïŒGruntã¯ãã¿ã¹ã¯ã®å®è¡ã«äœ¿çšã§ããå€ãã®ããã€ã¹ã®1ã€ã«ãããŸããã Gulpãããªãã«ãŽã£ãããªãã ããã ïŒ ãã®èšäºã§èª¬æãããŠããæ©èœã確èªããåŸã§ãããã«ãçšã®ç¬èªã®ããŒã«ã»ãããäœæãããå Žåã¯ãåé¡ãããŸããïŒ ãã®èšäºã§Gruntãã¬ãã¥ãŒããŸããGruntã¯ããã§ã«å€æ°ã®ãŠãŒã¶ãŒããããšã³ã·ã¹ãã ã§ããããã§ãã
Gruntfileã®æŽç
å€ãã®Gruntãã©ã°ã€ã³ããã©ã°ã€ã³ããããGruntfileã«å€ãã®ã¿ã¹ã¯ãèšè¿°ããããšãããšãããã«é¢åã§ãµããŒããé£ãããªããŸãã 幞ããªããšã«ããã®ç¹å®ã®åé¡ã«ç¹åãããã©ã°ã€ã³ãããã€ããããŸããGruntfileããããã§æŽç¶ãšããå€èŠ³ã«æ»ããŸãã
æé©ååã®Gruntfile
ããã¯ãæé©ååã®Gruntfileã®å€èŠ³ã§ãã
module.exports = function(grunt) { grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), concat: { dist: { src: ['src/js/jquery.js','src/js/intro.js', 'src/js/main.js', 'src/js/outro.js'], dest: 'dist/build.js', } }, uglify: { dist: { files: { 'dist/build.min.js': ['dist/build.js'] } } }, imagemin: { options: { cache: false }, dist: { files: [{ expand: true, cwd: 'src/', src: ['**/*.{png,jpg,gif}'], dest: 'dist/' }] } } }); grunt.loadNpmTasks('grunt-contrib-concat'); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-imagemin'); grunt.registerTask('default', ['concat', 'uglify', 'imagemin']); };
ä»ãªãããããïŒ ããã¯ãã£ãšæªãã ãããšæã£ãïŒ ç¶æããããšã¯ããªãå¯èœã§ãïŒããããããããããããªãã¯æ£ããã§ãããã ç°¡åã«ããããã«ãã«ã¹ã¿ãã€ãºãªãã§3ã€ã®ãã©ã°ã€ã³ã®ã¿ãè¿œå ããŸããã ãã®èšäºã§ãæŠéããããžã§ã¯ãã§äœ¿çšãããå®éã®Gruntfileã®äŸãæäŸããå Žåãç¡éã®ã¹ã¯ããŒã«ãå¿ èŠã«ãªããŸãã ããŠãããã«ã€ããŠäœãã§ãããèŠãŠã¿ãŸãããïŒ
ãã©ã°ã€ã³ãèªåããŒããã
ãã³ãïŒ load-grunt-configã«ã¯load-grunt-tasksãå«ãŸããŠããã®ã§ãèªã¿ãããªãå Žåã¯ãã®èšäºãã¹ãããããŠãæ°æã¡ã害ããããšã¯ãããŸããã
æ°ãããã©ã°ã€ã³ããããžã§ã¯ãã«è¿œå ããå Žåã¯ããããžã§ã¯ãã®äŸåé¢ä¿ãšããŠpackage.jsonã«è¿œå ããGruntfileã«ããŒãããå¿ èŠããããŸãã ãã©ã°ã€ã³ã grunt-contrib-concat ãã®å Žåã次ã®ããã«ãªããŸãã
// tell Grunt to load that plugin grunt.loadNpmTasks('grunt-contrib-concat');
npmã䜿çšããŠãã©ã°ã€ã³ãåé€ããpackage.jsonãç·šéããããGruntfileã®æŽæ°ãå¿ãããšãã¢ã»ã³ããªãå£ããŸãã å°ããªãã©ã°ã€ã³ãload-grunt-tasksããç§ãã¡ã®å©ãã«ãªããŸãã
ãããŸã§ã¯ãGruntãã©ã°ã€ã³ãæåã§ããŒãããå¿ èŠããããŸããã
grunt.loadNpmTasks('grunt-contrib-concat'); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-imagemin');
load-gurnt-tasksã䜿çšãããšãã³ãŒãã®éã1è¡ã«æžããããšãã§ããŸãã
require('load-grunt-tasks')(grunt);
ãã©ã°ã€ã³ãæ¥ç¶ãããšãpackage.jsonãåæããããã©ã°ã€ã³ã®äŸåé¢ä¿ããªãŒã決å®ãããèªåçã«ããŒããããŸã
åå²æ§æãã¡ã€ã«
load-grunt-tasksã¯ãGruntfileã®ãµã€ãºãšè€éãã軜æžããŸããã倧èŠæš¡ãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããå Žåããã¡ã€ã«ãµã€ãºã¯åŒãç¶ãçå®ã«å¢å ããŸãã ãã®æç¹ã§ãæ°ãããã©ã°ã€ã³load-grunt-configãç»å ŽããŸãïŒ Gruntfileãã¿ã¹ã¯ã«åå²ã§ããŸãã ããã«ãload-grunt-tasksãšãã®æ©èœãã«ãã»ã«åããŸãïŒ
éèŠïŒ Gruntfileãå ±æããããšã¯ãåžžã«æé©ãªãœãªã¥ãŒã·ã§ã³ãšã¯éããŸããã ã¿ã¹ã¯éã§é¢é£ããèšå®ãå€æ°ããå ŽåïŒGruntfileã®æšæºåãªã©ïŒãããå°ã泚æããå¿ èŠããããŸãã
ãload-grunt-configããã©ã°ã€ã³ã䜿çšãããšãGruntfileã¯æ¬¡ã®ããã«ãªããŸãã
module.exports = function(grunt) { require('load-grunt-config')(grunt); };
ã¯ããããã§ãïŒ ããããã¡ã€ã«å šäœã§ãïŒ ããããæ§æãã¡ã€ã«ã¯ä»ã©ãã«ãããŸããïŒ
ãã£ã¬ã¯ããªãäœæããŠgruntãšããååãä»ããŸãã Gruntfileããããã£ã¬ã¯ããªã§å®è¡ããŠã¿ãŸãããã ããã©ã«ãã§ã¯ããã©ã°ã€ã³ã¯ã䜿çšããã¿ã¹ã¯ã§æå®ãããååã§ãã®ãã£ã¬ã¯ããªã®ãã¡ã€ã«ãæ¥ç¶ããŸãã ãããžã§ã¯ãã®æ§é ã¯æ¬¡ã®ããã«ãªããŸãã
- myproject/ -- Gruntfile.js -- grunt/ --- concat.js --- uglify.js --- imagemin.js
ããã§ã¯ãåã¿ã¹ã¯ã®èšå®ãåå¥ã®ãã¡ã€ã«ã«èšå®ããŸãããïŒããã¯ãGruntfileããã®éåžžã®ã³ããŒããŒã¹ãã§ããããšãããããŸãïŒã
grunt / concat.js
module.exports = { dist: { src: ['src/js/jquery.js', 'src/js/intro.js', 'src/js/main.js', 'src/js/outro.js'], dest: 'dist/build.js', } };
grunt / uglify.js
module.exports = { dist: { files: { 'dist/build.min.js': ['dist/build.js'] } } };
ããªã声/ imagemin.js
module.exports = { options: { cache: false }, dist: { files: [{ expand: true, cwd: 'src/', src: ['**/*.{png,jpg,gif}'], dest: 'dist/' }] } };
JavaScriptæ§æãããã¯ãèªåã®ãã®ã§ãªãå Žåãload-grunt-tasksã§ã¯YAMLãŸãã¯CoffeeScriptæ§æã䜿çšããããšãã§ããŸãã YAMLã䜿çšããŠæåŸã«å¿ èŠãªãã¡ã€ã«ãæžããŸãããã ããã¯ãšã€ãªã¢ã¹ãã¡ã€ã«ã«ãªããŸãã ããã¯ããã¹ãŠã®ã¿ã¹ã¯ãšã€ãªã¢ã¹ãç»é²ãããŠãããã¡ã€ã«ã§ãã ããã¯ãregisterTaské¢æ°ãåŒã³åºãåã«è¡ãå¿ èŠã®ããããšã§ãã å®éã®ãã¡ã€ã«ã¯æ¬¡ã®ãšããã§ãã
grunt / aliases.yaml
default: - 'concat' - 'uglify' - 'imagemin'
以äžã§ãïŒ ã³ã³ãœãŒã«ã§æ¬¡ã®ã³ãã³ããå®è¡ããŸãã
$ grunt
ãã¹ãŠãæ£åžžã«æ©èœããå Žåãå®éãGruntã®ãããã©ã«ããã¿ã¹ã¯ãäœæããŸããã é¢é£ãã¡ã€ã«ã§æå®ããé åºã§ãã¹ãŠã®ãã©ã°ã€ã³ãå®è¡ããŸãã ããŠãGruntfileã3è¡ã®ã³ãŒãã«æžãããã®ã§ãã©ã®ã¿ã¹ã¯ã§ãè¡ãä¿®æ£ããããã«Gruntfileã«å床è¡ãå¿ èŠã¯ãããŸãããããã¯å®äºã§ãã ãããããããŠãã ãããããã¯ãŸã éåžžã«é ãã§ãïŒ ã€ãŸãããã¹ãŠãéãŸããŸã§ã«å€ãã®æéãåŸ ããªããã°ãªããŸããã ãããæ¹åããæ¹æ³ãèŠãŠã¿ãŸãããïŒ
çµç«æéãæå°å
Webã¢ããªã±ãŒã·ã§ã³ã®ããŠã³ããŒãé床ãšèµ·åæéã¯ããã«ãã«å¿ èŠãªæéãããéèŠã§ãããé床ãé ããšãå€ãã®äžäŸ¿ãçããŸãã ããã«ããã grunt-contrib-watchãªã©ã®ãã©ã°ã€ã³ã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãèªåçã«ã¢ã»ã³ãã«ããããã»ã¹ããŸãã¯Gitãžã®ã³ãããåŸã«ãã«ãããããã»ã¹ãéåžžã«ãå°é£ãã«ãªããŸã-ããã¯å®éã®æ·åã«å€ãããŸãã èŠããã«ãã¢ã»ã³ããªã®å®è¡ãéãã»ã©ãã¯ãŒã¯ãããŒã¯ããè¯ããããéããªããŸãã ãããã¯ã·ã§ã³ã¢ã»ã³ããªã10å以äžãããå Žåã極端ãªå Žåã«ã®ã¿ããã«é Œããçµã¿ç«ãŠãããéãã³ãŒããŒã飲ã¿ã«è¡ããŸãã ããã¯çç£æ§ã®äœäžã§ãã ãããã絶æããªãã§ãã ãããç§ãã¡ã«ã¯éããçãããšãã§ããäœãããããŸãã
å€æŽããããã®ã®ã¿ãåéããŸãïŒ grunt-newer
ããããã®æèŠã¯ããããžã§ã¯ãå šäœãçµã¿ç«ãŠãåŸãããã€ãã®ãã¡ã€ã«ãå€æŽãããã¹ãŠãåã³çµã¿ç«ãŠããããŸã§2åç®ã®ã©ãŠã³ãã§åŸ æ©ããå¿ èŠãããå Žåã§ãã src / img /ãã£ã¬ã¯ããªå ã®1ã€ã®ç»åãå€æŽããäŸãèŠãŠã¿ãŸããã-ãã®å Žåãimageminãå®è¡ããŠç»åã®æé©åãå®è¡ããã®ã¯çã«ããªã£ãŠããŸããã1ã€ã®ç»åã«å¯ŸããŠã®ã¿ã§ãããã¡ããããã®å Žåã¯concatãšuglifyãåèµ·åããã ãã§ã貎éãªããã»ããµæéã®ç¡é§ã
ãã¡ããããã€ã§ãå®è¡ã§ããŸã
æšæºã§ã¯ãªãã³ã³ãœãŒã«ãã$ grunt imagemin
ã ããã«ãããå¿ èŠãªã¿ã¹ã¯ã®ã¿ãå®è¡ã§ããŸãããããåççãªãœãªã¥ãŒã·ã§ã³ããããŸãã ããã¯ããªã声ã®æ°ãããšåŒã°ããŸãã$ grunt
Grunt-newerã«ã¯ããŒã«ã«ãã£ãã·ã¥ããããããã«å€æŽããããã¡ã€ã«ã«é¢ããæ å ±ãä¿åãããã®ãã¡ã€ã«ã«å¯ŸããŠã®ã¿ã¿ã¹ã¯ãå®è¡ããŸãã æ¥ç¶æ¹æ³ãèŠãŠã¿ãŸãããã
aliases.yamlãèŠããŠããŸããïŒ å€ããŸããã
default: - 'concat' - 'uglify' - 'imagemin'
ããã«ïŒ
default: - 'newer:concat' - 'newer:uglify' - 'newer:imagemin'
ç°¡åã«èšãã°ãã¿ã¹ã¯ã®ããããã«ãã¬ãã£ãã¯ã¹ãnewerïŒããè¿œå ããã ãã§ããæåã«grunt-newerãã©ã°ã€ã³ãä»ããŠæž¡ãå¿ èŠããããŸãããã®ãã©ã°ã€ã³ã¯ãã¿ã¹ã¯ãå®è¡ãããã¡ã€ã«ãšå®è¡ããªããã¡ã€ã«ã決å®ããŸãã
ã¿ã¹ã¯ã䞊è¡ããŠå®è¡ããïŒ grunt-concurrent
grunt-concurrentã¯ãäºãã«ç¬ç«ããå€ãã®ã¿ã¹ã¯ããããå€ãã®æéããããå Žåã«éåžžã«åœ¹ç«ã€ãã©ã°ã€ã³ã§ãã ããã»ããµã®ã³ã¢ã䜿çšãããããã®ã¿ã¹ã¯ã䞊ååããŸãã
ç¹ã«ã¯ãŒã«ãªã®ã¯ããã®ãã©ã°ã€ã³ã®æ§æãéåžžã«ç°¡åãªããšã§ãã load-grunt-configã䜿çšããå Žåã¯ãslãäœæããŸãã ãã¡ã€ã«ïŒ
grunt / concurrent.js
module.exports = { first: ['concat'], second: ['uglify', 'imagemin'] };
æåïŒæåïŒãš2çªç®ïŒ2çªç®ïŒã®ãã¥ãŒã®äžŠåå®è¡ãèšå®ããã ãã§ãã æåã®æ®µéã§ã¯ããconcatãã¿ã¹ã¯ã®ã¿ãå®è¡ããŸãã 2çªç®ã®æ®µéã§ã¯ãuglifyãšimageminãå®è¡ããŸãã ãããã¯çžäºã«ç¬ç«ããŠããã䞊è¡ããŠå®è¡ããããããå®è¡æéã¯äž¡æ¹ã®ã¿ã¹ã¯ã«å ±éã§ãã
grunt-concurrentãã©ã°ã€ã³ãä»ããŠåŠçãããããã«ãããã©ã«ãã¿ã¹ã¯ã®ãšã€ãªã¢ã¹ãå€æŽããŸããã å€æŽãããaliases.yamlãã¡ã€ã«ã¯æ¬¡ã®ãšããã§ãã
default: - 'concurrent:first' - 'concurrent:second'
ããã§Gruntã¢ã»ã³ããªãåèµ·åãããšãã³ã³ã«ã¬ã³ããã©ã°ã€ã³ã¯ãŸãconcatã¿ã¹ã¯ãéå§ãã次ã«ç°ãªãããã»ããµã³ã¢ã§2ã€ã®ã¹ã¬ãããäœæããŠãimageminãšuglifyã䞊è¡ããŠåäœããããã«ããŸãã ãã£ãããïŒ
ç°¡åãªãã³ã ïŒåçŽãªäŸã§ã¯ãããªã声ã®åæçºçããã«ããèããé«éåããå¯èœæ§ã¯éåžžã«äœãã§ãã ãã®çç±ã¯ãGruntã€ã³ã¹ã¿ã³ã¹ã«è¿œå ã®ã¹ã¬ãããå®è¡ããããã®ãªãŒããŒãããïŒãªãŒããŒãããïŒã§ãã ç§ã®èšç®ããå€æãããšãå°ãªããšã300ms /ã¹ããªãŒã ããããŸãã
ã¢ã»ã³ããªã«ã¯ã©ããããæéãããããŸãããïŒ æéã®ããªã声ãå©ãã«ãªããŸã
ããŠãããã§ãã¹ãŠã®ã¿ã¹ã¯ãæé©åãããŸãããåã¿ã¹ã¯ã«ãããæéãç¥ãããšã¯éåžžã«äŸ¿å©ã§ãã 幞ããªããšã«ããã®ä»äºãå®ç§ã«è¡ããã©ã°ã€ã³ããããŸãã
time-gruntã¯å€å žçãªæå³ã§ã®ãã©ã°ã€ã³ã§ã¯ãªãïŒloadNpmTaskçµç±ã§ã¯æ¥ç¶ããŸããïŒããããload-grunt-configãªã©ã®ãçŽæ¥ãæ¥ç¶ãããã©ã°ã€ã³ãæããŸãã load-grunt-configã®å Žåãšåãæ¹æ³ã§ããã®ãã©ã°ã€ã³ã®æ¥ç¶ãGruntfileã«è¿œå ããŸãã Gruntfileã¯æ¬¡ã®ããã«ãªããŸãã
module.exports = function(grunt) { // measures the time each task takes require('time-grunt')(grunt); // load grunt config require('load-grunt-config')(grunt); };
倱æããallã³ããŸãããããã ãã§ã-ã³ã³ãœãŒã«ããGruntãåèµ·åããŠã¿ãŠãã ãããåã¿ã¹ã¯ïŒããã³ã¢ã»ã³ããªå šäœïŒã«ã€ããŠãã©ã³ã¿ã€ã ã«é¢ããé©åã«ãã©ãŒããããããæ å ±ã衚瀺ãããã¯ãã§ãã

èªåèŠå ±ã·ã¹ãã
ãã¹ãŠã®ã¿ã¹ã¯ãè¿ éã«å®è¡ããèªåã¢ã»ã³ãã«ïŒã€ãŸããgrunt-contrib-watchãã©ã°ã€ã³ãŸãã¯ã³ãããåŸã®ããã¯ã®äœ¿çšã«ãããã¡ã€ã«ãžã®å€æŽã®è¿œè·¡ïŒã®æ©èœãæäŸãããæé©åãããã³ã¬ã¯ã¿ãŒãçšæã§ããã®ã§ãã·ã¹ãã ãæã€ããšã¯çŽ æŽãããããšã§ãããã¯ããªãã®æ°ãããã«ãã䜿çšããæºåãã§ãããšãããŸãã¯äœããããŸããããªããšãããªãã«èŠåããããšãã§ããã§ããããïŒ grunt-notifyã«äŒããŸãã
ããã©ã«ãã§ã¯ãgrunt-notifyã¯ãGruntãã¹ããŒãããã¹ãŠã®ãšã©ãŒãšèŠåã«å¯ŸããŠèªåã¢ã©ãŒããæäŸããŸãã ãããè¡ãã«ã¯ãMac OS XãŸãã¯Windowsçšã®GrowlãMountain Lionããã³Mavericksã®Notification CenterãNotify-sendãªã©ãOSã«ã€ã³ã¹ããŒã«ãããŠããèŠåã·ã¹ãã ã䜿çšã§ããŸãã ãã®æ©èœãååŸããããã«å¿ èŠãªã®ã¯ãnpmãªããžããªãããã©ã°ã€ã³ãã€ã³ã¹ããŒã«ããGruntfileã«æ¥ç¶ããããšã ãã§ãïŒäžèšã®ããã«grunt-load-configã䜿çšããå Žåããã®ã¹ãããã¯èªååãããŸãïŒïŒã
ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«å¿ããŠãã©ã°ã€ã³ãã©ã®ããã«æ©èœãããã次ã«ç€ºããŸãã

ãšã©ãŒãšèŠåã«å ããŠãæåŸã®ã¿ã¹ã¯ã®åŸã«éå§ããããã«æ§æããŸãããã
grunt-contrib-configã䜿çšããŠãã¡ã€ã«éã§ã¿ã¹ã¯ãåé¢ããããšãåæãšããŠããŸãã å¿ èŠãªãã¡ã€ã«ã¯æ¬¡ã®ãšããã§ãã
grunt / notify.js
module.exports = { imagemin: { options: { title: 'Build complete', // optional message: '<%= pkg.name %> build finished successfully.' //required } } } }
æ§æã®ããã·ã¥ããŒã«ãã£ãŠãgrunt-notifyã«æ¥ç¶ããã¿ã¹ã¯ã®ååã決ãŸããŸãã ãã®äŸã§ã¯ãimageminã¿ã¹ã¯ïŒå®è¡ãããªã¹ãã®æåŸã®ã¿ã¹ã¯ïŒãå®äºããçŽåŸã«ã¢ã©ãŒããçæããŸãã
ãããŠçµè«ãšããŠ
ãã®èšäºã§èª¬æããããã«ãæåãããã¹ãŠãè¡ã£ãå Žåã䞊ååãšéžæçåŠçã«ããéåžžã«é«éã§ãéåžžã«é«éã§çµç¹åãããã³ã¬ã¯ã¿ãŒã®èªãã®ããææè ã§ãããšèããããšãã§ããŸãã ãŸããã¢ã»ã³ããªã®çµæã«ã€ããŠã¯ãæ éã«éç¥ãããããšãå¿ããªãã§ãã ããïŒ
Gruntã®æ¹åã«åœ¹ç«ã€ãã®ä»ã®èå³æ·±ããœãªã¥ãŒã·ã§ã³ããŸãã¯äŸ¿å©ãªãã©ã°ã€ã³ãèŠã€ããå Žåã¯ããç¥ãããã ããïŒ ãããŸã§ã®éããã«ãã¯æåããŸããïŒ
翻蚳è ãã
ç§ã¯ãã®èšäºãã§ããã ããªãªãžãã«ã«è¿ã圢ã«ç¿»èš³ããããšããŸããããããã€ãã®å Žæã§ããã·ã¢èªã§èããããããã«ããã€ãã®è»œèããäœããŸããã è±èªã®æç« ãäœæãããã¹ãŠã®é çªãšæ¹æ³ããã·ã¢èªã«ããŸãé©åããããã§ã¯ãããŸããã ç§ã¯ããªããç解ããŠãããæ±ãããšãæ¬åœã«é¡ã£ãŠããŸãã
èšäºãã楜ãã¿ãã ããã 建èšçãªæ¹å€ãšæ¹åã®ææ¡ãèããŠããããã§ãã ã³ã¡ã³ããæè¿ããŸãïŒ