node package manager

grunt-config-merge

Adds <code>grunt.mergeConfig(...)</code>, which replaces <code>grunt.initConfig(...)</code>, and enables you to <strong>organize your Gruntfile by feature</strong>, rather than by task.

Adds grunt.mergeConfig(...), which replaces grunt.initConfig(...), and enables you to organize your Gruntfile by feature, rather than by task.

Gruntfile.js

module.exports = function(grunt) {
 
  require('grunt-config-merge')(grunt);
 
 
 
  // Default options: 
  grunt.mergeConfig({
    concat: { options: { process: true } },
    watch: { options: { atBegin: true, livereload: true } }
  });
 
 
 
  // JavaScripts: 
  grunt.registerTask('build-js', [ 'concat:JS', 'jshint' ]);
  grunt.mergeConfig({
    concat: { 'JS': { files: allJS } },
    jshint: { 'JS': { files: allJS } },
    watch: { 'JS': { files: allJS, tasks: [ 'build-js' ] } }
  });
 
 
 
  // CSS: 
  grunt.registerTask('build-css', [ 'concat:CSS' ]);
  grunt.mergeConfig({
    concat: { 'CSS': { files: allCSS } },
    watch: { 'CSS': { files: allCSS, tasks: [ 'build-css' ] } }
  });
 
 
 
  grunt.loadNpmTasks('grunt-contrib-concat');
  grunt.loadNpmTasks('grunt-contrib-jshint');
  grunt.loadNpmTasks('grunt-contrib-watch');
 
};

Gruntfile.js:

module.exports = function(grunt) {
 
  require('grunt-config-merge')(grunt);
 
  require('./build-defaults.js')(grunt);
  require('./build-js.js')(grunt);
  require('./build-css.js')(grunt);
 
  grunt.loadNpmTasks('grunt-contrib-concat');
  grunt.loadNpmTasks('grunt-contrib-jshint');
  grunt.loadNpmTasks('grunt-contrib-watch');
 
};

build-css.js:

module.exports = function(grunt) {
 
  // CSS: 
  grunt.registerTask('build-css', [ 'concat:CSS' ]);
  grunt.mergeConfig({
    concat: { 'CSS': { files: allCSS } },
    watch: { 'CSS': { files: allCSS, tasks: [ 'build-css' ] } }
  });
 
};

build-js.js:

module.exports = function(grunt) {
 
  // JavaScripts: 
  grunt.registerTask('build-js', [ 'concat:JS', 'jshint' ]);
  grunt.mergeConfig({
    concat: { 'JS': { files: allJS } },
    jshint: { 'JS': { files: allJS } },
    watch: { 'JS': { files: allJS, tasks: [ 'build-js' ] } }
  });
 
};

Etc...

Download and install via Node Package Manager:

npm install --save-dev grunt-config-merge

Then add this line near the top of your Gruntfile:

require('grunt-config-merge')(grunt);

And go ahead and start using grunt.mergeConfig instead of grunt.initConfig!