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

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

Псевдоним Задачи

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

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

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

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

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

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

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

Несколько задач

Каждый раз, когда вы запускаете несколько задач, 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: Welcome to tutorialspoint при каждом запуске через grunt log: bar . Он будет регистрировать foo: 1,2,3, затем bar: Welcome to 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.');
});

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

grunt.registerTask('foo', 'My task "foo" .', function() {
   // Log the value of the property. Returns null if the property is undefined.
   grunt.log.writeln('The meta.name property is: ' + grunt.config('meta.name'));
   // Also logs the value of the property. Returns null if the property is undefined.
   grunt.log.writeln('The meta.name property is: ' + grunt.config(['meta', 'name']));
});