Учебники

Grunt — Создание задач

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

Alias ​​Tasks

Всякий раз, когда указан список задач, одна или несколько других задач могут быть связаны с новой задачей. Запуск псевдонима, в свою очередь, будет запускать все указанные задачи в списке задач . Аргумент taskList должен быть массивом задач, как показано ниже —

grunt.registerTask(taskName, [description, ] taskList)	

Например, когда вы определяете список задач с помощью задач jshint , concat и uglify и задаете имя задачи по умолчанию , все перечисленные задачи будут запускаться автоматически, если Grunt выполняется без указания каких-либо задач.

grunt.registerTask('default', ['jshint', 'concat', 'uglify']);

Вы также можете указать аргументы задачи, как показано ниже —

grunt.registerTask('dist', ['concat:dist', 'uglify:dist']);	

В приведенной выше задаче псевдоним dist выполняет задачи concat и uglify .

Многозадачность

Каждый раз, когда вы запускаете несколько задач, Grunt ищет одноименное свойство в конфигурации Grunt. Эти задачи могут иметь несколько конфигураций, которые будут определены с использованием произвольно названных целей .

При указании задачи и цели будет обрабатываться только указанная конфигурация цели.

grunt concat:foo

Приведенная выше команда будет запускать только целевой foo .

Когда вы указываете только задачу, все цели будут обработаны.

grunt concat

Приведенная выше команда будет перебирать все цели задачи concat .

Когда вы переименовываете задачу с помощью grunt.task.renameTask , свойство с новым именем задачи ищется в объекте конфигурации Grunt.

grunt.initConfig({
   log: {
      foo: [1, 2, 3],
      bar: 'Welcome to tutorialspoint',
      sap: true
   }
});

grunt.registerMultiTask('log', 'Log stuff.', function() {
   grunt.log.writeln(this.target + ': ' + this.data);
});

В приведенном выше примере мультизадача будет регистрировать foo: 1,2,3, если Grunt запускался через grunt log: foo, или он будет регистрировать bar: Добро пожаловать в tutorialspoint при каждом запуске через grunt log: bar . Он будет записывать foo: 1,2,3, затем bar: Добро пожаловать в tutorialspoint, затем sap: true, когда Grunt запускается как журнал grunt .

Основные задачи

Каждый раз, когда вы запускаете базовую задачу, Grunt не будет искать конфигурацию или среду. Вместо этого он запускает указанную функцию задачи, передает все разделенные двоеточием аргументы, указанные в качестве аргументов функции.

grunt.registerTask(taskName, [description, ] taskFunction)	

В следующем примере задача регистрирует foo, проверяя 123 , выполняется ли Grunt с помощью команды grunt foo: testing: 123 . Всякий раз, когда задача запускается без аргументов как grunt foo , задача будет записывать в журнал foo, без аргументов .

grunt.registerTask('foo', 'A simple task to logs stuff.', function(arg1, arg2) {
   if (arguments.length === 0) {
      grunt.log.writeln(this.name + ", no args");
   } else {
      grunt.log.writeln(this.name + ", " + arg1 + " " + arg2);
   }
});

Пользовательские задачи

Если вы не хотите следовать многозадачной структуре, вы можете определить свою пользовательскую задачу, как показано ниже —

grunt.registerTask('default', 'My "default" task description.', function() {
  grunt.log.writeln('Currently running the "default" task.');
});  

Можно выполнить задачу внутри другой задачи, как показано ниже —

grunt.registerTask('foo', 'My "foo" task.', function() {
   // Enqueue bar and baz tasks, to run after foo completes, in-order.
   grunt.task.run('bar', 'baz');
   // Or:
   grunt.task.run(['bar', 'baz']);
});  

Вы также можете создавать асинхронные задачи, как показано ниже —

grunt.registerTask('asyncfoo', 'My "asyncfoo" task.', function() {
   // Force task into async mode and grab a handle to the done() function.
   var done = this.async();
   // Run some sync stuff.
   grunt.log.writeln('Processing your task..');
   // Run some async stuff.
   setTimeout(function() {
      grunt.log.writeln('Finished!');
      done();
   }, 1000);
});

Вы можете создавать задачи, которые могут получить доступ к их имени и аргументам, как показано ниже —

grunt.registerTask('foo', 'My task "foo" .', function(a, b) {
   grunt.log.writeln(this.name, a, b);
});

// Usage:
// grunt foo
//   logs: "foo", undefined, undefined
// grunt foo:bar
//   logs: "foo", "bar", undefined
// grunt foo:bar:baz
//   logs: "foo", "bar", "baz"

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

grunt.registerTask('foo', 'My task "foo" .', function() {
   if (failureOfSomeKind) {
      grunt.log.error('This is an error message.');
   }

   // If this task had errors then fail by returning false
   if (ifErrors) { return false; }

   grunt.log.writeln('This is success message');
});  

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

grunt.registerTask('foo', 'My task "foo" .', function() {
   // Fail synchronously.
   return false;
});

grunt.registerTask('bar', 'My task "bar" .', function() {
   var done = this.async();
   setTimeout(function() {
      // Fail asynchronously.
      done(false);
   }, 1000);
});  

Задачи могут зависеть от других задач для успешного выполнения. Помните, что grunt.task.requires на самом деле не будет выполнять другие задачи, вместо этого он будет только проверять, выполнено ли оно и не удалось ли это.

grunt.registerTask('foo', 'My task "foo" .', function() {
   return false;
});

grunt.registerTask('bar', 'My task "bar" .', function() {
   // Fail task if foo task failed or never ran.
   grunt.task.requires('foo');
   // This code executes if the foo task executed successfully.
   grunt.log.writeln('Hello, World.. Welcome to Tutorialspoint!..');
});

// Usage:
// grunt foo bar doesn't log, because foo failed to execute.
// **Note: This is an example of space-separated sequential commands,
// (similar to executing two lines of code: `grunt foo` then `grunt bar`)
// grunt bar doesn't log, because foo never ran.  

Задачи могут даже потерпеть неудачу, когда требуемые свойства конфигурации не найдены.

grunt.registerTask('foo', 'My task "foo" .', function() {
   // Fail task if meta.name config properties is missing
   // Format 1: String 
   grunt.config.requires('meta.name');
   // or Format 2: Array
   grunt.config.requires(['meta', 'name']);
   // Log... conditionally.
   grunt.log.writeln('This only log if meta.name is defined in the config.');
});  

Задачи могут получить доступ к свойствам конфигурации, как показано ниже —