paseg
paseg

Reputation: 416

How to get grunt task name given on command line?

In order to customize my grunt tasks, I need access to the grunt task name given on the command line when starting grunt.

The options is no problem, since its well documented (grunt.options). It's also well documented how to find out the task name, when running a grunt task.

But I need access to the task name before.

Eg, the user writes grunt build --target=client

When configuring the grunt job in my Gruntfile.js, I can use grunt.option('target') to get 'client'.

But how do I get hold of parameter build before the task build starts?

Any guidance is much appreciated!

Upvotes: 20

Views: 8522

Answers (3)

tandrewnichols
tandrewnichols

Reputation: 3466

A better way is to use grunt.task.current which has information about the currently running task, including a name property. Within a task, the context (i.e. this) is the same object. So . . .

grunt.registerTask('foo', 'Foobar all the things', function() {
  console.log(grunt.task.current.name); // foo
  console.log(this.name); // foo
  console.log(this === grunt.task.current); // true
});

If build is an alias to other tasks and you just want to know what command was typed that led to the current task execution, I typically use process.argv[2]. If you examine process.argv, you'll see that argv[0] is node (because grunt is a node process), argv[1] is grunt, and argv[2] is the actual grunt task (followed by any params in the remainder of argv).

EDIT:

Example output from console.log(grunt.task.current) on [email protected] from within a task (can't have a current task from not a current task).

{
  nameArgs: 'server:dev',
  name: 'server',
  args: [],
  flags: {},
  async: [Function],
  errorCount: [Getter],
  requires: [Function],
  requiresConfig: [Function],
  options: [Function],
  target: 'dev',
  data: { options: { debugPort: 5858, cwd: 'server' } },
  files: [],
  filesSrc: [Getter]
}

Upvotes: 4

dc5
dc5

Reputation: 12441

Your grunt file is basically just a function. Try adding this line to the top:

module.exports = function( grunt ) {
/*==> */    console.log(grunt.option('target'));
/*==> */    console.log(grunt.cli.tasks);

// Add your pre task code here...

Running with grunt build --target=client should give you the output:

client
[ 'build' ]

At that point, you can run any code you need to before your task is run including setting values with new dependencies.

Upvotes: 31

mishik
mishik

Reputation: 10003

You can use grunt.util.hooker.hook for this.

Example (part of Gruntfile.coffee):

grunt.util.hooker.hook grunt.task, (opt) ->
  if grunt.task.current and grunt.task.current.nameArgs
    console.log "Task to run: " + grunt.task.current.nameArgs

CMD:

C:\some_dir>grunt concat --cmp my_cmp
Task to run: concat
Running "concat:coffee" (concat) task
Task to run: concat:coffee
File "core.coffee" created.

Done, without errors.

There is also a hack that I've used to prevent certain task execution:

grunt.util.hooker.hook grunt.task, (opt) ->
  if grunt.task.current and grunt.task.current.nameArgs
    console.log "Task to run: " + grunt.task.current.nameArgs
    if grunt.task.current.nameArgs is "<some task you don't want user to run>"
      console.log "Ooooh, not <doing smth> today :("
      exit()  # Not valid. Don't know how to exit :), but will stop grunt anyway

CMD, when allowed:

C:\some_dir>grunt concat:coffee --cmp my_cmp
Running "concat:coffee" (concat) task
Task to run: concat:coffee
File "core.coffee" created.

Done, without errors.

CMD, when prevented:

C:\some_dir>grunt concat:coffee --cmp my_cmp
Running "concat:coffee" (concat) task
Task to run: concat:coffee
Ooooh, not concating today :(
Warning: exit is not defined Use --force to continue.

Aborted due to warnings.

Upvotes: 1

Related Questions