Grunt - Criando Tarefas

Neste capítulo, vamos aprender sobre a criação de tarefas . Sempre que você executa o Grunt, uma ou mais tarefas são especificadas para serem executadas, notificando o Grunt o que você gostaria que ele fizesse. Se você especificar a tarefa padrão , ela será executada por padrão.

Alias ​​Tasks

Sempre que uma lista de tarefas é especificada, uma ou mais outras tarefas podem ter o alias de uma nova tarefa. A execução do alias, por sua vez, executará todas as tarefas especificadas na taskList . O argumento taskList deve ser uma matriz de tarefas conforme mostrado abaixo -

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

Por exemplo, quando você define uma taskList com as tarefas jshint , concat e uglify e especifica o taskName como padrão , todas as tarefas listadas serão executadas automaticamente se Grunt for executado sem especificar nenhuma tarefa.

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

Você também pode especificar os argumentos da tarefa como mostrado abaixo -

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

Na tarefa acima, o alias dist executa as tarefas concat e uglify .

Multi Tarefas

Sempre que você executa várias tarefas, o Grunt procura uma propriedade com o mesmo nome na configuração do Grunt. Essas tarefas podem ter várias configurações, que serão definidas usando destinos nomeados arbitrariamente .

Ao especificar uma tarefa e um destino, apenas a configuração de destino especificada será processada.

grunt concat:foo

O comando acima executará apenas o foo de destino .

Quando você especifica apenas uma tarefa, todos os destinos são processados.

grunt concat

O comando acima irá iterar sobre todos os destinos da tarefa concat .

Quando você renomeia uma tarefa com grunt.task.renameTask , uma propriedade com o novo nome da tarefa é pesquisada no objeto de configuração por 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);
});

No exemplo acima, a multi tarefa irá registrar foo: 1,2,3 se o Grunt foi executado através do grunt log: foo ou irá registrar bar: Bem-vindo ao tutorialspoint sempre que executado através do grunt log: bar . Ele irá logar foo: 1,2,3 então bar: Bem-vindo ao tutorialspoint then sap: true quando Grunt for executado como grunt log .

Tarefas Básicas

Sempre que você executa uma tarefa básica, o Grunt não pesquisa a configuração ou o ambiente. Em vez disso, ele executa a função de tarefa especificada, passa quaisquer argumentos separados por dois pontos especificados em como argumentos de função.

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

No exemplo a seguir, a tarefa registra foo, testando 123 se Grunt for executado por meio do comando grunt foo: testing: 123 . Sempre que a tarefa for executada sem argumentos como grunt foo , a tarefa logará foo, sem argumentos .

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

Tarefas Personalizadas

Se você não quiser seguir a estrutura de múltiplas tarefas , você pode definir sua tarefa personalizada conforme mostrado abaixo -

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

É possível executar uma tarefa dentro de outra tarefa como mostrado abaixo -

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

Você também pode criar tarefas assíncronas conforme mostrado abaixo -

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

Você pode criar tarefas que podem acessar seus nomes e argumentos conforme mostrado abaixo -

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"

Você pode criar sua tarefa de forma que, sempre que algum erro for registrado, as tarefas possam falhar conforme mostrado abaixo -

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

Sempre que uma tarefa falhar, todas as tarefas seguintes serão encerradas, a menos que --force tenha sido especificado.

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

As tarefas podem depender de outras tarefas para uma execução bem-sucedida. Lembre-se de que o grunt.task.requires não executará realmente outras tarefas; em vez disso, ele apenas verificará se foi executado e não falhou.

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.

As tarefas podem até falhar sempre que as propriedades de configuração necessárias não forem encontradas.

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

As tarefas podem acessar as propriedades de configuração conforme mostrado abaixo -

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