How can I run a grunt task from within a grunt task?

Javascriptnode.jsGruntjs

Javascript Problem Overview


I've created a new grunt task and within it I want to use grunt-contrib-concat to concatenate a few files together.

I looked through the docs but I don't find anything that hinted at being able to do this. It seems like a trivial use case, so I'm probably just over looking something.

Update 1:

I also want to be able to configure this task from within my custom task.

For example, I create a list of files in my custom task. After I have that list, I want to pass them to the concat task. How can I do that?

I would like to be able to do something like this.

grunt.task.run('concat', { src: ['file1','file2'], dest: 'out.js'})

Update 2:

To achieve what I want, I have to manually configure the grunt task. Here's an example that showed me what I wanted.

https://github.com/gruntjs/grunt-contrib/issues/118#issuecomment-8482130

Javascript Solutions


Solution 1 - Javascript

Here's an example of manually configuring a task within a task and then running it.

https://github.com/gruntjs/grunt-contrib/issues/118#issuecomment-8482130

 grunt.registerMultiTask('multicss', 'Minify CSS files in a folder', function() {
        var count = 0;
        grunt.file.expandFiles(this.data).forEach(function(file) {
            var property = 'mincss.css'+count+'.files';
            var value = {};
            value[file] = file;
            grunt.config(property, value);
            grunt.log.writeln("Minifying CSS "+file);
            count++;
        });
        grunt.task.run('mincss');
    });

Solution 2 - Javascript

From https://github.com/gruntjs/grunt/wiki/Creating-tasks

grunt.registerTask('foo', 'My "foo" task.', function() {
  // Enqueue "bar" and "baz" tasks, to run after "foo" finishes, in-order.
  grunt.task.run('bar', 'baz');
  // Or:
  grunt.task.run(['bar', 'baz']);
});

Solution 3 - Javascript

Thx to Arron that pointed us out in the right direction to his own question. The grunt.config is the key from the example above. This task will override the src property of the browserify task

Task definition:

  grunt.registerTask('tests', function (spec) {

    if (spec) {
      grunt.config('browserify.tests.src', spec);
    }

    grunt.task.run(['jshint', 'browserify:tests', 'jasmine']);

  }); 

Task call:

grunt tests

or

grunt tests:somewhere/specPath.js

Solution 4 - Javascript

If you are feeling lazy I ended up publishing a npm module that forwards the configs from your task into the subtask that you want to run:

https://www.npmjs.org/package/extend-grunt-plugin

Solution 5 - Javascript

How can we run same task multiple times from a task for eg.

grunt.registerTask('asyncfoo', 'My "asyncfoo" task.', function() {
  
  var done = this.async();
  // Run some sync stuff.
  grunt.log.writeln('Processing task...');
  var versions = Object.keys(versionConf);
 
  setTimeout(function() {
    versions.forEach(function(version) {
      console.info(version);
      //process.env.version = version;
      grunt.config('port', versionConf[version].port);
      grunt.task.run('test-perf');
    })
    done();
  }, 1000);
 
});

I want to run test-perf with diff port every time according to version.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionArron SView Question on Stackoverflow
Solution 1 - JavascriptArron SView Answer on Stackoverflow
Solution 2 - JavascriptPascal BelloncleView Answer on Stackoverflow
Solution 3 - JavascriptelmuchachoView Answer on Stackoverflow
Solution 4 - JavascriptruyadornoView Answer on Stackoverflow
Solution 5 - JavascriptShilpiView Answer on Stackoverflow