1月 5, 2014
Gruntでフォルダを統合するスクリプト
こういう差分だけのフォルダとファイルを
20140101_ROOT ├ title ├ title_01.png └ title_02.png ├ banner ├ banner_01.png ├ banner_02.png └ banner_03.png └ item └ item_01.png 20140102_ROOT ├ title ├ title_03.png └ title_04.png ├ banner ├ banner_04.png ├ banner_05.png └ item ├ item_02.png └ item_03.png
同じ階層にして統合したい
integration_ROOT ├ title ├ title_01.png ├ title_02.png ├ title_03.png └ title_04.png ├ banner ├ banner_01.png ├ banner_02.png ├ banner_03.png ├ banner_04.png ├ banner_05.png └ item ├ item_01.png ├ item_02.png └ item_03.png
統合作業をするために、こんな感じでプロジェクトフォルダに入れる。
project ├ Gruntfile.js ├ updateFolder ├ 20140101_ROOT ├ ... ├ ... └ ... └ 20140102_ROOT ├ ... ├ ... └ ...
Gruntfile.jsで統合スクリプトを書く。
'use strict'; module.exports = function (grunt) { grunt.initConfig({ ... }); grunt.task.registerTask('integrate', 'Log stuff.', function() { grunt.file.recurse('updateFolder/', fileCopy); function fileCopy(abspath, rootdir, subdir, filename){ // いらないOSの隠しファイルは処理しない if( abspath.indexOf('Thumbs.db')<=0 && abspath.indexOf('.DS_Store')<=0){ var moto = abspath; var dirarr = moto.split('/'); dirarr.shift(); dirarr.shift(); // 新しい階層パス var newPath = 'integration_ROOT/'; for (var i = 0; i < dirarr.length; i++) { newPath += dirarr[i]; if( i != dirarr.length-1 ){ newPath += '/'; } }; // ファイルの処理を監視するためにログを吐かせる grunt.log.writeln('元ファイル: '+moto); grunt.log.writeln('新ファイル: '+newPath); // フォルダに入ってるもののみ処理をかける // そうしないとエラーが出る if(dirarr.length>=1){ grunt.file.copy(abspath, newPath); } } } }); };
Terminalで実行して、問題がなければ、
新しく生成した「integration_ROOT」の中に統合したフォルダとファイルが入ってるはず。
grunt integrate
今回の主役
grunt.file.recurse('updateFolder/', fileCopy);
指定フォルダ(第一引数)以下のものをすべて再帰的に処理を回してくれる関数。
ありがたい、ありがたい。