Run grunt task with multi-configuration.
JavaScript
Latest commit ba03b89 Jun 23, 2014 @neekey Merge pull request #1 from chrisjlee/patch-1
Typos and grammatical changes
Permalink
Failed to load latest commit information.
lib init Sep 13, 2013
tasks 1、优化命令行传参的格式 Sep 30, 2013
test 1、优化命令行传参的格式 Sep 30, 2013
.gitignore init Sep 13, 2013
.jshintrc init Sep 13, 2013
.travis.yml init Sep 13, 2013
README.md Typos and grammatical changes Oct 29, 2013
package.json update to 0.0.5 Oct 14, 2013

README.md

grunt-multi

Run Grunt task with multi-configuration.

How to use

Say that we defined a very simple grunt task:

targetPage: 'a',
outTarget: 'mod1.js',

copy: {
   subDir: {
       files: [
           {
               expand: true,
               cwd: 'src',
               src: [ '<%= targetPage %>/*.js' ],
               dest: 'build'
           }
       ]
   },
   out: {
       files: [
           {
               expand: true,
               cwd: 'src',
               src: '<%= outTarget %>',
               dest: 'build'
           }
       ]
   }
}

...

// defined your task here
grunt.registerTask('build', [ 'copy' ]);

Quite simple, and when you run grunt build, you will get all the JS files under src/a copied to build/a.

But what if when your project grows larger, maybe you got like src/b, src/c.. in your project?

And that's what Grunt-multi want to solve, you don't need to modify your copy configuration, but just want exactly the same task run multiple times but with different configurations ( here within the example, we just want to change the variable targetPage ).

Just see code below, let's configure the grunt-multi task:

multi: {
    // Yes, you can use file pattern to match files or paths
    pattern: {
        options: {
            vars: {
                page_list: { patterns: '*', options: { cwd: 'src', filter: 'isDirectory' } }
            },
            config: {
                targetPage: '<%= page_list %>'
            },
            tasks: [ 'copy' ]
        }
    },
    // Also you can specify a list.
    list: {
        options: {
            vars: {
                page_list: [ 'a', 'b', 'c' ]
            },
            config: {
                targetPage: '<%= page_list %>'
            },
            tasks: [ 'copy' ]
        }
    },
    // A more smart way might be to read from an external file.
    external: {
        options: {
            vars: {
                page_list: grunt.file.readJSON('build.json').target
            },
            config: {
                targetPage: '<%= page_list %>'
            },
            tasks: [ 'copy' ]
        }
    },
    // However, sometimes you may want to specify a constant variable.
    constant: {
        options: {
            vars: {
                page_list: [ 'a', 'b', 'c' ],
                out_target: 'mod2.js'
            },
            config: {
                targetPage: '<%= page_list %>',
                outTarget: '<%= out_target %>'
            },
            tasks: [ 'copy' ]
        }
    },
    // For the consideration of flexibility,you can use a function, but note that the return value must be either an Array or String.
    func: {
        options: {
            vars: {
                page_list: function(){
                    return [ 'a', 'b', 'c' ];
                }
            },
            config: {
                targetPage: '<%= page_list %>'
            },
            tasks: [ 'copy' ]
        }
    },
    // Also you can use a function to directly modify the config. This is useful if you want to get more flexibility to modify the configuration.
    // params:
    //      1、vars: a single instant of the vars you defined
    //      2、rawConfig: the raw configuration.
    constant_func: {
        options: {
            vars: {
                page_list: [ 'a', 'b', 'c' ],
                out_target: 'mod2.js'
            },
            config: {
                targetPage: function( vars, rawConfig ){ return vars.page_list; },
                outTarget: function( vars, rawConfig ){ return vars.out_target; }
            },
            tasks: [ 'copy' ]
        }
    },
}

After configuration, you just run grunt multi:func( or any defined sub task ) to execute the multi version of copy.

Options

Available options:

  • vars: variables can be used within the next option config, in fact var is a list, you can get the list by file pattern, array, function(return a list).
  • config: the config item you want to change, you can use vars as template variables.
  • tasks: the tasks you want to run.
  • continue: if set to true, you indicate that the task will not stop. ( example: watch ).

Specify vars with command

$ grunt multi:func --page_list a,b,c --outTarget mod2.js

Note that this will override the configuration in gruntfile.js.

How to decide if its a multi-single thread.

In some cases, maybe you want to tell if the current thread is a child spawned by grunt-multi. Just use the multi-single option to distinguish:

if( grunt.option( 'multi-single' ) ){
    console.log( 'Child' );
}

Enjoy!