Skip to content

Instantly share code, notes, and snippets.

@dsuket
Last active December 17, 2015 20:28
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dsuket/5667276 to your computer and use it in GitHub Desktop.
Save dsuket/5667276 to your computer and use it in GitHub Desktop.
更新されたファイルだけ対象にするフィルタの定義
module.exports = function(grunt) {
var fs = require('fs');
// ファイルのmtimeを比較
var compareMtime = function(src, target) {
var isNewer = true;
if (fs.existsSync(target)) {
isNewer = fs.statSync(src).mtime > fs.statSync(target).mtime;
}
grunt.log.debug("compareMtime:", src, target, isNewer);
return isNewer;
}
// ターゲットよりも新しい場合に対象とするフィルタ
var newer = function(target) {
return function(file) {
return compareMtime(file, target);
}
}
// srcがターゲットよりも一つでも新しい場合に対象とするフィルタ
var newerAny = function(target, src) {
var value;
return function(file) {
if (value !== undefined) {
return value;
}
// valueが無い場合
if (typeof src === "string") {
src = eval(src);
} else if (!(src instanceof Array)) {
src = [src];
}
grunt.log.debug("src:", src);
value = src.some(function(srcfile){
return compareMtime(srcfile, target);
});
return value;
}
}
// ターゲットDirのファイルよりも新しい場合に対象とするフィルタ
var expandNewer = function(targetDir) {
return function(file) {
return compareMtime(file, targetDir + file);
}
}
var pkg = grunt.file.readJSON('package.json');
var config = {
// compass
compass: {
main: {
options: {
config: 'config.rb',
environment: 'production'
}
}
},
// compress css
cssmin: {
main: {
files: [{
src: ['css/app.css'],
dest: 'css/app.min.css',
filter: newer('css/app.min.css')
}]
}
},
// compress javascript
uglify: {
main: {
options: {
mangle: true
},
files: [{
src: [
'js/aa.js',
'js/bb.js',
'js/cc.js',
],
dest: 'js/app.min.js',
filter: newerAny('js/app.min.js', 'config.uglify.main.files[0].src')
}]
}
},
// Copy to dist
copy: {
dist: {
files: [{
expand: true,
src: [
'css/app.min.css',
'js/app.min.js',
'images/**',
'fonts/**',
'icons/**',
'svg/**',
],
dest: '../dist/',
filter: expandNewer('../dist/')
}, {
src: ['index-release.html'],
dest: '../dist/index.html',
filter: newer('../dist/index.html')
}],
}
}
};
grunt.initConfig(config);
// load Task
var taskName;
for(taskName in pkg.devDependencies) {
if(taskName.substring(0, 6) == 'grunt-') {
grunt.loadNpmTasks(taskName);
}
}
grunt.registerTask('default', [
'compass',
'cssmin',
'uglify',
'copy',
]);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment