Как получить имя задачи grunt, указанное в командной строке?

Чтобы настроить мои задачи grunt, мне нужно получить доступ к имени задачи grunt, указанному в командной строке при запуске grunt.

Параметры не являются проблемой, поскольку ее хорошо документированы (grunt.options). Он также хорошо документировал, как определить имя задачи при выполнении задачи grunt.

Но мне нужен доступ к имени задачи раньше.

Например, пользователь пишет grunt build --target=client

При настройке задания grunt в моем Gruntfile.js, я могу использовать grunt.option('target'), чтобы получить 'client'.

Но как мне получить параметр build до начала сборки задачи?

Любое руководство очень ценится!

Ответы

Ответ 1

Ваш файл grunt - это просто функция. Попробуйте добавить эту строку вверху:

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

// Add your pre task code here...

Запуск с grunt build --target=client должен дать вам результат:

client
[ 'build' ]

В этот момент вы можете запустить любой код, который вам нужен, до запуска вашей задачи, включая установку значений с новыми зависимостями.

Ответ 2

Лучше всего использовать grunt.task.current, который имеет информацию о текущей выполняемой задаче, включая свойство name. В рамках задачи контекст (т.е. this) является одним и тем же объектом. Так.,

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
});

Если build является псевдонимом для других задач, и вы просто хотите знать, какая команда была введена, что привело к выполнению текущей задачи, я обычно использую process.argv[2]. Если вы просмотрите process.argv, вы увидите, что argv[0] - node (потому что grunt - это процесс node), argv[1] - grunt, а argv[2] - это настоящая задача ворчания ( за которыми следуют любые параметры в оставшейся части argv).

EDIT:

Пример вывода из console.log(grunt.task.current) на [email protected] из задачи (не может иметь текущую задачу из текущей задачи).

{
  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]
}

Ответ 3

Вы можете использовать grunt.util.hooker.hook для этого.

Пример (часть 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.

Существует также хак, который я использовал для предотвращения выполнения определенной задачи:

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, если разрешено:

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 при предотвращении:

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.