#The directory Structure
– Gruntfile.js
– app
|– index.php
|– js
|– css
|– templates
|– template.html
– dist
#The directory Structure
– Gruntfile.js
– app
|– index.php
|– js
|– css
|– templates
|– template.html
– dist
'use strict'; | |
var lrSnippet = require('grunt-contrib-livereload/lib/utils').livereloadSnippet; | |
var mountFolder = function (connect, dir) { | |
return connect.static(require('path').resolve(dir)); | |
}; | |
// # Globbing | |
// for performance reasons we're only matching one level down: | |
// 'test/spec/{,*/}*.js' | |
// use this if you want to match all subfolders: | |
// 'test/spec/**/*.js' | |
module.exports = function (grunt) { | |
// load all grunt tasks | |
require('matchdep').filterDev('grunt-*').forEach(grunt.loadNpmTasks); | |
// configurable paths | |
var yeomanConfig = { | |
app: 'app', | |
dist: 'dist' | |
}; | |
grunt.initConfig({ | |
yeoman: yeomanConfig, | |
clean: { | |
dist: ['<%= yeoman.dist %>/*'] | |
}, | |
// not used since Uglify task does concat, | |
// but still available if needed | |
/*concat: { | |
dist: {} | |
},*/ | |
/* | |
uglify: { | |
dist: {} | |
},*/ | |
rev: { | |
dist: { | |
files: { | |
src: [ | |
'<%= yeoman.dist %>/scripts/*.js', | |
'<%= yeoman.dist %>/styles/*.css', | |
'<%= yeoman.dist %>/images/{,*/}*.{png,jpg,jpeg,gif,webp}', | |
'<%= yeoman.dist %>/styles/fonts/*' | |
] | |
} | |
} | |
}, | |
useminPrepare: { | |
html: '<%= yeoman.app %>/templates/template.php', | |
options: { | |
dest: '<%= yeoman.dist %>' | |
} | |
}, | |
usemin: { | |
html: ['<%= yeoman.dist %>/templates/{,*/}*.php'], | |
css: ['<%= yeoman.dist %>/styles/{,*/}*.css'], | |
options: { | |
basedir: '<%= yeoman.dist %>', | |
dirs: ['<%= yeoman.dist %>/**/*'] | |
} | |
}, | |
cssmin: { | |
dist: { | |
files: { | |
'<%= yeoman.dist %>/styles/main.css': [ | |
'.tmp/styles/{,*/}*.css', | |
'<%= yeoman.app %>/styles/{,*/}*.css' | |
] | |
} | |
} | |
}, | |
htmlmin: { | |
dist: { | |
options: { | |
/*removeCommentsFromCDATA: true, | |
// https://github.com/yeoman/grunt-usemin/issues/44 | |
//collapseWhitespace: true, | |
collapseBooleanAttributes: true, | |
removeAttributeQuotes: true, | |
removeRedundantAttributes: true, | |
useShortDoctype: true, | |
removeEmptyAttributes: true, | |
removeOptionalTags: true*/ | |
}, | |
files: [{ | |
expand: true, | |
cwd: '<%= yeoman.app %>/templates', | |
src: '*.php', | |
dest: '<%= yeoman.dist %>/templates' | |
}] | |
} | |
}, | |
copy: { | |
dist: { | |
files: [{ | |
expand: true, | |
dot: true, | |
cwd: '<%= yeoman.app %>', | |
dest: '<%= yeoman.dist %>', | |
src: [ | |
'*.{ico,txt}', | |
'.htaccess' | |
] | |
}] | |
} | |
}, | |
}); | |
grunt.renameTask('regarde', 'watch'); | |
grunt.registerTask('build', [ | |
'clean:dist', | |
'useminPrepare', | |
'htmlmin', | |
'concat', | |
'cssmin', | |
'uglify', | |
'copy', | |
'rev', | |
'usemin' | |
]); | |
grunt.registerTask('default', [ | |
'build' | |
]); | |
}; |
<!doctype html> | |
<head> | |
<meta charset="utf-8"> | |
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> | |
<title>Hello World!</title> | |
<link rel="stylesheet" href="styles/main.css"> | |
<!-- build:js(app) scripts/vendor/modernizr.js --> | |
<script src="components/modernizr/modernizr.js"></script> | |
<!-- endbuild --> | |
</head> | |
<body> | |
<h1>Hello World!</h1> | |
<!-- build:js(app) scripts/main.js --> | |
<script src="components/jquery/jquery.js"></script> | |
<script src="scripts/script1.js"></script> | |
<!-- endbuild --> | |
<!-- build:js(app) scripts/plugins.js --> | |
<script src="components/script2.js"></script> | |
<script src="components/script3.js"></script> | |
<!-- endbuild --> | |
</body> | |
</html> |
is possible to create another file, and declare variables that it can then be used in gruntfile.js file. mapping your project and creating folders and subfolders.
declare in gruntfile.js
pkg: grunt.file.readJSON('package.json'), properties: grunt.file.readJSON('properties.json'),
new file properties.json
{ "fonts" : "bower_components/bootstrap/dist/fonts", "php" : "app/", "css" : "app/css", "view" : "app/php/view/", "controller" : "app/php/controller/", "service" : "app/php/service/", "model" : "app/php/model/", "util" : "app/php/util/", "src" : "app", "dist" : "dist" } /\* put files not handled in other tasks here _/ copy: { dist: { files: [{ expand: true, dot: true, cwd: '<%= properties .src %>', dest: '<%= properties .dist %>', src: ['_.txt', '.htaccess'] }, { /\* fonts bootstrap _/ expand: true, dot: true, cwd: '<%= properties .fonts %>', dest: '<%= properties .dist %>/fonts', src: ['_.ttf', '*.woff'] } .....
I can't figure how this would work for images, i.e. if a template in a subfolder references a <img src="img/logo.png"/>. How to tell usemin that templates are effectively loaded from the root path?