Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Running grunt task with api, without command line

I want to create and run grunt task in node.js code for test use.

var foo = function() {
    var grunt = require("grunt");

    var options = {"blahblah": null} // ...creating dynamic grunt options, such as concat and jshint
    grunt.initConfig(options);
    grunt.registerTask('default', [/*grunt subtasks*/]);
}

But this doesn't work. Grunt doesn't seem to run any task. I'm almost sure that there is some API to run grunt task externally without command line, but don't know how to do it.

Is there any way to do it?

like image 840
Kivol Avatar asked May 15 '13 11:05

Kivol


People also ask

How do I run grunt locally?

Installing grunt-cli locally If you prefer the idiomatic Node. js method to get started with a project ( npm install && npm test ) then install grunt-cli locally with npm install grunt-cli --save-dev . Then add a script to your package. json to run the associated grunt command: "scripts": { "test": "grunt test" } .

What is Gruntfile?

Grunt is a JavaScript task runner, a tool used to automatically perform frequent tasks such as minification, compilation, unit testing, and linting. It uses a command-line interface to run custom tasks defined in a file (known as a Gruntfile). Grunt was created by Ben Alman and is written in Node.


2 Answers

You can. I don't know why anyone would need to do this as currently Grunt is a command line tool. WARNING: I don't recommend running Grunt in this way. But here it is:

var grunt = require('grunt');

// hack to avoid loading a Gruntfile
// You can skip this and just use a Gruntfile instead
grunt.task.init = function() {};

// Init config
grunt.initConfig({
  jshint: {
    all: ['index.js']
  }
});

// Register your own tasks
grunt.registerTask('mytask', function() {
  grunt.log.write('Ran my task.');
});

// Load tasks from npm
grunt.loadNpmTasks('grunt-contrib-jshint');

// Finally run the tasks, with options and a callback when we're done
grunt.tasks(['mytask', 'jshint'], {}, function() {
  grunt.log.ok('Done running tasks.');
});
like image 88
Kyle Robinson Young Avatar answered Oct 09 '22 03:10

Kyle Robinson Young


You can get inspiration on how to run grunt from code by looking at grunt-cli which does this and which is a project maintained by the grunt folks.

Grunt is launched from code in grunt-cli/bin/grunt and you can read more about the options in grunt/lib/grunt/cli.js.

I use it in a private project like this:

var grunt = require("grunt");
grunt.cli({
  gruntfile: __dirname + "/path/to/someGruntfile.js",
  extra: {key: "value"}
});

The key "extra" will be available from inside the gruntfile as grunt.option("extra")

Here is a bloggpost that describes an alternative way to run a grunt task: http://andrewduthie.com/2014/01/14/running-grunt-tasks-without-grunt-cli/

like image 34
gabrielf Avatar answered Oct 09 '22 03:10

gabrielf