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);
指定フォルダ(第一引数)以下のものをすべて再帰的に処理を回してくれる関数。
ありがたい、ありがたい。