How can I run a grunt task from within a grunt task?
Javascriptnode.jsGruntjsJavascript 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:
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.