Ipad
Ipad

Reputation: 392

load grunt task from another gruntfile

I want to avoid duplicate code, so i am trying to load grunt task from Grunt file "a" and use them in gruntfile "b".

that means: i want to see all task of "a" in file "b" (but without code), just setup like a reference or template to another gruntfile.

here is grunt file "b":

module.exports = function (grunt) {
'use strict';

var karmaGrunt = './../../grunt',
    abortHandler = function () {
        var errors = grunt.fail.errorcount,
            warnings = grunt.fail.warncount;

        if (errors > 0 || warnings > 0) {
            //run rocketlauncher python script and then stop the grunt runner.
            grunt.task.run(["shell:rocketlauncher", "fatal"]);
        }
    },
    fatal = function () {
        // this function stops grunt and make the jenkins build red.
        grunt.fail.fatal('failed');
    };

require("grunt-load-gruntfile")(grunt);

// load grunt task from another file and add it.
grunt.loadGruntfile(karmaGrunt);

//grunt needs to continue on error or warnings, that's why we have to set the force property true
grunt.option('force', true);

grunt.initConfig({
    shell: {
        options: {
            execOptions: {
                cwd: '../scripts'
            }
        },
        'rocketlauncher': {
            command: './runRocketLauncher.sh'
        }
    }
});

grunt.loadNpmTasks('grunt-karma');
grunt.loadNpmTasks('grunt-shell');

grunt.registerTask('build-process', ['karma', 'abortHandler']);
grunt.registerTask('abortHandler', abortHandler);
grunt.registerTask('fatal', fatal);
}

here is file "a":

module.exports = function (grunt) {
"use strict";
var eConfig = '../e-specs/karma.config.js',
    dConfig = '../d-specs/karma.config.js',
    cConfig = '../c-specs/karma.config.js';
grunt.initConfig({
    karma: {
        options: {
            reporters: ['progress', 'coverage', 'threshold']
        },
        c: {
            configFile: cConfig
        },
        d: {
            configFile: dConfig
        },
        e: {
            configFile: eConfig
        }
    }
});

grunt.loadNpmTasks('grunt-karma');
};

my file b load the task "Karma" but if i run only the grunt file of a i have 3 nested task ("e","c","d") but if i load them from another file, the only task i can see is "karma"

the error is:

No "karma" targets found. Warning: Task "karma" failed. Used --force, continuing.

Done, but with warnings.

If i run the same task in file "a" directly the task is working like a charm.

Upvotes: 3

Views: 1677

Answers (1)

Max
Max

Reputation: 121

There is a grunt plugin to load another Gruntfile: grunt-load-gruntfile

With this you can merge two Grunt configurations, including the defined tasks.

Here is an example:

./Gruntfile.js:

module.exports = function (grunt) {

    require("grunt-load-gruntfile")(grunt);

    grunt.loadGruntfile("web"); //loads the Gruntfile from the folder web/

    grunt.registerTask('showConfig', "shows the current config", function(){
        console.log(JSON.stringify(grunt.config(), null, 2));
    });
};

and the second Gruntfile in ./web/Gruntfile.js.

module.exports = function (grunt) {

    grunt.config("WebConfig", "Configuration from the Gruntfile in web/Gruntfile.js");

    grunt.registerTask('server', "runs the server",function(){
        console.log("just shows this message");
    });
};

running grunt showConfig executes the task from the first Gruntfile and displays the configuration, including the parameter defined in ./web/Gruntfile.js.

running grunt server executes the task from ./web/Gruntfile.js.

Upvotes: 3

Related Questions