Created
April 21, 2016 14:25
-
-
Save VivienAdnot/5eff99918befd49e53eecde54d92a988 to your computer and use it in GitHub Desktop.
A gruntfile example with livereload
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'use strict'; | |
// # Globbing | |
// for performance reasons we're only matching one level down: | |
// 'test/spec/{,*/}*.js' | |
// use this if you want to recursively match all subfolders: | |
// 'test/spec/**/*.js' | |
module.exports = function (grunt) { | |
// Load grunt tasks automatically | |
require('load-grunt-tasks')(grunt); | |
// Time how long tasks take. Can help when optimizing build times | |
require('time-grunt')(grunt); | |
// Turn on the stack trace by default | |
grunt.option('stack', true); | |
// Define the configuration for all the tasks | |
grunt.initConfig({ | |
// Read the package file | |
pkg: grunt.file.readJSON('package.json'), | |
// Project settings | |
config: { | |
// Configurable paths | |
app: 'app', | |
dist: 'dist' | |
}, | |
// Watches files for changes and runs tasks based on the changed files | |
watch: { | |
jade: { | |
files: ['<%= config.app %>/{,*/}*.jade'], | |
tasks: ['jade:server'] | |
}, | |
coffee: { | |
files: ['<%= config.app %>/scripts/{,*/}*.{coffee,litcoffee,coffee.md}'], | |
tasks: ['newer:coffee', 'jshint:server'] | |
}, | |
js: { | |
files: ['<%= config.app %>/scripts/{,*/}*.js'], | |
tasks: ['newer:copy:server', 'jshint:server'] | |
}, | |
jshint: { | |
files: ['.jshintrc'], | |
tasks: ['jshint:server'] | |
}, | |
gruntfile: { | |
files: ['Gruntfile.js'], | |
tasks: ['jshint:gruntfile'] | |
}, | |
sass: { | |
files: ['<%= config.app %>/styles/{,*/}*.{scss,sass}'], | |
tasks: ['sass', 'autoprefixer'] | |
}, | |
styles: { | |
files: ['<%= config.app %>/styles/{,*/}*.css'], | |
tasks: ['newer:copy:server', 'autoprefixer'] | |
}, | |
livereload: { | |
options: { | |
livereload: '<%= connect.livereload.options.livereload %>' | |
}, | |
files: [ | |
'.tmp/{,*/}*.html', | |
'.tmp/styles/{,*/}*.css', | |
'.tmp/scripts/{,*/}*.js', | |
'<%= config.app %>/images/{,*/}*' | |
] | |
} | |
}, | |
// The actual grunt server settings | |
connect: { | |
livereload: { | |
options: { | |
port: 9000, | |
livereload: 35729, | |
hostname: '0.0.0.0', | |
open: true, | |
base: [ | |
'.tmp', | |
'<%= config.app %>' | |
] | |
} | |
}, | |
dist: { | |
options: { | |
open: 'http://msif.local', | |
livereload: false | |
} | |
} | |
}, | |
// Empties folders to start fresh | |
clean: { | |
dist: { | |
files: [{ | |
dot: true, | |
src: [ | |
'.tmp', | |
'<%= config.dist %>/*', | |
'!<%= config.dist %>/.git*' | |
] | |
}] | |
}, | |
server: '.tmp' | |
}, | |
// Compile Jade to HTML | |
jade: { | |
options: { | |
pretty: true, | |
data: function() { | |
// Return an object of data to pass to templates | |
return grunt.file.readJSON('data.json'); | |
}, | |
}, | |
server: { | |
files: [{ | |
expand: true, | |
cwd: '<%= config.app %>', | |
dest: '.tmp/', | |
src: 'layouts/*.jade', | |
ext: '.html', | |
flatten: true | |
}] | |
}, | |
dist: { | |
files: [{ | |
expand: true, | |
cwd: '<%= config.app %>', | |
dest: '<%= config.dist %>/', | |
src: 'layouts/*.jade', | |
ext: '.html', | |
flatten: true | |
}] | |
}, | |
}, | |
// Make sure code styles are up to par and there are no obvious mistakes | |
jshint: { | |
options: { | |
jshintrc: '.jshintrc', | |
reporter: require('jshint-stylish') | |
}, | |
gruntfile: { | |
options: { | |
jshintrc: '.jshintrc' | |
}, | |
src: 'Gruntfile.js' | |
}, | |
server: { | |
src: [ | |
'.tmp/scripts/{,*/}*.js', | |
] | |
}, | |
dist: { | |
options: { | |
force: true // Usually false | |
}, | |
src: [ | |
'<%= jshint.server.src %>' | |
] | |
} | |
}, | |
// Compiles CoffeeScript to JavaScript | |
coffee: { | |
options: { | |
bare: true | |
}, | |
server: { | |
files: [{ | |
expand: true, | |
cwd: '<%= config.app %>/scripts', | |
src: '{,*/}*.{coffee,litcoffee,coffee.md}', | |
dest: '.tmp/scripts', | |
ext: '.js' | |
}] | |
}, | |
dist: { | |
files: [{ | |
expand: true, | |
cwd: '<%= config.app %>/scripts', | |
src: '{,*/}*.{coffee,litcoffee,coffee.md}', | |
dest: '<%= config.dist %>/scripts', | |
ext: '.js' | |
}] | |
}, | |
}, | |
// Compiles Sass to CSS and generates necessary files if requested | |
sass: { | |
options: { | |
style: 'expanded' | |
}, | |
all: { | |
src: '<%= config.app %>/styles/main.scss', | |
dest: '.tmp/styles/main.css' | |
} | |
}, | |
// Add vendor prefixed styles | |
autoprefixer: { | |
options: { | |
browsers: ['last 2 versions'] | |
}, | |
dist: { | |
files: [{ | |
expand: true, | |
cwd: '.tmp/styles/', | |
src: '{,*/}*.css', | |
dest: '.tmp/styles/', | |
ext: '.css' | |
}] | |
} | |
}, | |
validation: { | |
options: { | |
relaxerror: [ //ignores these errors | |
'Bad value X-UA-Compatible for attribute http-equiv on element meta.', | |
'Attribute autocomplete not allowed on element textarea at this point.', | |
'Attribute autocapitalize not allowed on element input at this point.' | |
], | |
reset: true, | |
reportpath: false | |
}, | |
files: { | |
src: [ | |
'<%= config.dist %>/*.html' | |
] | |
} | |
}, | |
// Reads HTML for usemin blocks to enable smart builds that automatically | |
// concat, minify and revision files. Creates configurations in memory so | |
// additional tasks can operate on them | |
useminPrepare: { | |
options: { | |
dest: '<%= config.dist %>', | |
staging: '.tmp' | |
}, | |
html: ['<%= config.dist %>/{,*/}*.html'] | |
}, | |
concat: { | |
options: { | |
sourceMap: true | |
} | |
}, | |
// Performs rewrites based on useminPrepare configuration | |
usemin: { | |
options: { | |
assetsDirs: [ | |
'<%= config.dist %>', | |
'<%= config.dist %>/images' | |
] | |
}, | |
html: ['<%= config.dist %>/{,*/}*.html'], | |
css: ['<%= config.dist %>/styles/{,*/}*.css'] | |
}, | |
// The following *-min tasks produce minified files in the dist folder | |
imagemin: { | |
dist: { | |
files: [{ | |
expand: true, | |
cwd: '<%= config.app %>/images', | |
src: '{,*/}*.{gif,jpeg,jpg,png}', | |
dest: '<%= config.dist %>/images' | |
}] | |
} | |
}, | |
// Copies remaining files to places other tasks can use | |
copy: { | |
dist: { | |
files: [ | |
{ | |
expand: true, | |
dot: true, | |
cwd: '<%= config.app %>', | |
dest: '<%= config.dist %>', | |
src: [ | |
'*.{ico,png,txt,svg}', | |
'.htaccess', | |
'*.php', | |
'*.html', | |
'images/{,*/}*.{webp,svg}', | |
'fonts/{,*/}*.*' | |
] | |
},{ | |
expand: true, | |
cwd: '<%= config.app %>/bower_components/fontawesome/fonts/', | |
dest: '<%= config.dist %>/fonts/', | |
src: '*.*', | |
flatten: true | |
},{ | |
expand: true, | |
cwd: '<%= config.app %>/bower_components/bootstrap-sass-official/assets/fonts/bootstrap/', | |
dest: '<%= config.dist %>/fonts/', | |
src: '*.*', | |
flatten: true | |
}, | |
{ | |
src: '<%= config.app %>/bower_components/jquery/dist/jquery.min.js', | |
dest: '<%= config.dist %>/scripts/jquery.min.js' | |
}, | |
{ | |
src: '<%= config.app %>/bower_components/jquery/dist/jquery.min.map', | |
dest: '<%= config.dist %>/scripts/jquery.min.map' | |
} | |
] | |
}, | |
server: { | |
files: [ | |
{ | |
expand: true, | |
dot: true, | |
cwd: '<%= config.app %>/styles', | |
dest: '.tmp/styles/', | |
src: '{,*/}*.css' | |
},{ | |
// Copy any javascript files to the temo directory | |
expand: true, | |
dot: true, | |
cwd: '<%= config.app %>/scripts/vendor', | |
dest: '.tmp/scripts/', | |
src: '{,*/}*.js' | |
},{ | |
expand: true, | |
cwd: '<%= config.app %>/bower_components/fontawesome/fonts/', | |
dest: '.tmp/fonts/', | |
src: '*.*', | |
flatten: true | |
},{ | |
expand: true, | |
cwd: '<%= config.app %>/bower_components/bootstrap-sass-official/assets/fonts/bootstrap/', | |
dest: '.tmp/fonts/', | |
src: '*.*', | |
flatten: true | |
} | |
] | |
}, | |
}, | |
// Generates a custom Modernizr build that includes only the tests you | |
// reference in your app | |
modernizr: { | |
devFile: '<%= config.app %>/bower_components/modernizr/modernizr.js', | |
outputFile: '<%= config.dist %>/scripts/modernizr.js', | |
files: [ | |
'<%= config.dist %>/scripts/{,*/}*.js', | |
'<%= config.dist %>/styles/{,*/}*.css', | |
'!<%= config.dist %>/scripts/vendor/*' | |
], | |
uglify: true, | |
extra: { | |
shiv: false, | |
load: false | |
} | |
}, | |
bump: { | |
options: { | |
files: ['package.json', 'bower.json'], | |
push: true, | |
pushTo: 'origin', | |
createTag: true, | |
tagName: 'v%VERSION%', | |
tagMessage: 'Version %VERSION%', | |
commitFiles: ['<%= bump.options.files %>', 'CHANGELOG.md'], | |
commitMessage: 'Bumped version to v%VERSION%' | |
} | |
}, | |
changelog: { | |
options: { | |
editor: 'atom -w' | |
} | |
}, | |
// Run some tasks in parallel to speed up build process | |
concurrent: { | |
options: { | |
logConcurrentOutput: true | |
}, | |
server: [ | |
'sass', | |
'newer:coffee:server', | |
'newer:jade:server', | |
'newer:copy:server' | |
], | |
dist: [ | |
'coffee:dist', | |
'sass', | |
'jade:dist', | |
'imagemin' | |
] | |
} | |
}); | |
// Build all the things | |
grunt.registerTask('default', [ | |
'clean:server', | |
'concurrent:server', | |
'autoprefixer', | |
]); | |
grunt.registerTask('serve', function (target) { | |
if (target === 'dist') { | |
return grunt.task.run(['build', 'connect:dist:keepalive']); | |
} | |
grunt.task.run([ | |
'default', | |
'connect:livereload', | |
'watch' | |
]); | |
}); | |
grunt.registerTask('server', function (target) { | |
grunt.log.warn('The `server` task has been deprecated. Use `grunt serve` to start a server.'); | |
grunt.task.run([target ? ('serve:' + target) : 'serve']); | |
}); | |
grunt.registerTask('test', [ | |
'newer:jade:dist', | |
'newer:coffee:server', | |
'jshint:server', | |
'validation' | |
]); | |
grunt.registerTask('build', [ | |
'clean:dist', | |
'concurrent:dist', | |
'useminPrepare', | |
'jshint:dist', | |
'autoprefixer', | |
'concat', | |
'cssmin', | |
'uglify', | |
'copy:dist', | |
'modernizr', | |
'usemin', | |
'connect:dist' | |
]); | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment