Grunt - Tạo công việc

Trong chương này, chúng ta hãy tìm hiểu về cách tạo tác vụ . Bất cứ khi nào bạn chạy Grunt, một hoặc nhiều nhiệm vụ được chỉ định để chạy sẽ thông báo cho Grunt biết bạn muốn nó làm gì. Nếu bạn chỉ định nhiệm vụ mặc định , thì nó sẽ chạy theo mặc định.

Nhiệm vụ bí danh

Bất cứ khi nào danh sách nhiệm vụ được chỉ định, một hoặc nhiều tác vụ khác có thể được đặt biệt hiệu bởi một tác vụ mới. Chạy bí danh sẽ lần lượt chạy mọi tác vụ được chỉ định trong taskList . Đối số taskList phải là một mảng các tác vụ như hình dưới đây:

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

Ví dụ: khi bạn xác định một taskList với các tác vụ jshint , concatuglify và chỉ định taskName làm mặc định , tất cả các tác vụ được liệt kê sẽ được chạy tự động nếu Grunt được thực thi mà không chỉ định bất kỳ tác vụ nào.

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

Bạn cũng có thể chỉ định các đối số nhiệm vụ như được hiển thị bên dưới:

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

Trong tác vụ trên, alias dist chạy cả tác vụ concatuglify .

Đa nhiệm vụ

Bất cứ khi nào bạn chạy nhiều tác vụ, Grunt sẽ tìm kiếm một thuộc tính có cùng tên trong cấu hình Grunt. Các tác vụ này có thể có nhiều cấu hình, sẽ được xác định bằng cách sử dụng các mục tiêu được đặt tên tùy ý .

Khi bạn chỉ định cả nhiệm vụ và mục tiêu, chỉ cấu hình mục tiêu được chỉ định mới được xử lý.

grunt concat:foo

Lệnh trên sẽ chỉ chạy foo đích .

Khi bạn chỉ định một nhiệm vụ, thì tất cả các mục tiêu sẽ được xử lý.

grunt concat

Lệnh trên sẽ lặp lại trên tất cả các mục tiêu của tác vụ concat .

Khi bạn đổi tên một tác vụ bằng grunt.task.renameTask , một thuộc tính có tên tác vụ mới sẽ được Grunt tìm kiếm trong đối tượng cấu hình.

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

Trong ví dụ trên, đa nhiệm vụ sẽ ghi foo: 1,2,3 nếu Grunt được chạy qua grunt log: foo hoặc nó sẽ đăng nhập thanh: Chào mừng bạn đến với hướng dẫn bất cứ khi nào chạy qua grunt log: bar . Nó sẽ đăng nhập foo: 1,2,3 rồi thanh: Chào mừng bạn đến với điểm hướng dẫn rồi đến sap: true khi Grunt chạy dưới dạng nhật ký grunt .

Nhiệm vụ cơ bản

Bất cứ khi nào bạn chạy một tác vụ cơ bản, Grunt sẽ không tìm kiếm cấu hình hoặc môi trường. Thay vào đó, nó chạy hàm tác vụ được chỉ định, chuyển bất kỳ đối số được phân tách bằng dấu hai chấm nào được chỉ định làm đối số hàm.

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

Trong ví dụ sau, nhiệm vụ ghi nhật ký foo, kiểm tra 123 nếu Grunt được thực thi thông qua lệnh grunt foo: testing: 123 . Bất cứ khi nào tác vụ được chạy mà không có đối số là grunt foo , tác vụ sẽ ghi foo, không có args .

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

Nhiệm vụ tùy chỉnh

Nếu bạn không muốn làm theo cấu trúc đa tác vụ , bạn có thể xác định tác vụ tùy chỉnh của mình như hình dưới đây -

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

Có thể chạy một tác vụ trong một tác vụ khác như hình dưới đây -

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

Bạn cũng có thể tạo các tác vụ không đồng bộ như hình dưới đây -

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

Bạn có thể tạo các tác vụ có thể truy cập vào tên và đối số của chúng như hình dưới đây -

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"

Bạn có thể tạo tác vụ của mình theo cách mà bất cứ khi nào có lỗi được ghi lại, các tác vụ có thể không thành công như hình dưới đây -

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

Bất cứ khi nào một tác vụ không thành công, mọi tác vụ sau sẽ bị chấm dứt trừ khi --force được chỉ định.

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

Các tác vụ có thể phụ thuộc vào các tác vụ khác để thực hiện thành công. Hãy nhớ rằng grunt.task.requires sẽ không thực sự thực thi (các) tác vụ khác, thay vào đó nó sẽ chỉ kiểm tra xem liệu nó đã thực thi hay chưa.

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.

Các tác vụ thậm chí có thể thất bại bất cứ khi nào không tìm thấy các thuộc tính cấu hình yêu cầu.

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

Các tác vụ có thể truy cập các thuộc tính cấu hình như hình dưới đây -

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