Grunt - การสร้างงาน

ในบทนี้ให้เราเรียนรู้เกี่ยวกับการสร้างงาน เมื่อใดก็ตามที่คุณเรียกใช้ Grunt งานอย่างน้อยหนึ่งงานจะถูกระบุให้รันซึ่งจะแจ้งให้ Grunt ทราบว่าคุณต้องการให้ทำอะไร หากคุณระบุงานเริ่มต้นงานนั้นจะทำงานตามค่าเริ่มต้น

งานนามแฝง

เมื่อใดก็ตามที่ระบุรายการงานไว้งานอื่น ๆ อย่างน้อยหนึ่งงานสามารถถูกรวมนามโดยงานใหม่ได้ เล่นนามแฝงในทางกลับกันจะทำงานทุกงานที่ระบุไว้ในTasklist Tasklistอาร์กิวเมนต์ควรจะอาร์เรย์ของงานตามที่แสดงด้านล่าง -

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

ตัวอย่างเช่นเมื่อคุณกำหนดtaskListด้วยงานjshint , concatและuglifyและระบุtaskNameเป็นค่าเริ่มต้นงานที่แสดงรายการทั้งหมดจะถูกรันโดยอัตโนมัติหากดำเนินการ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คุณสมบัติที่มีชื่องานใหม่จะถูกค้นหาในวัตถุ config โดย 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ถ้าฮึดฮัดกำลังวิ่งผ่านบันทึกเสียงฮึดฮัด: fooหรือมันจะเข้าสู่ระบบบาร์: ยินดีต้อนรับสู่ tutorialspointเมื่อใดก็ตามที่วิ่งผ่านบันทึกเสียงฮึดฮัด: บาร์ มันจะเข้าสู่ระบบfoo: 1,2,3แล้วบาร์: ยินดีต้อนรับสู่ tutorialspointแล้วSAP: จริงเมื่อวิ่งฮึดฮัดเป็นบันทึกเสียงฮึดฮัด

งานพื้นฐาน

เมื่อใดก็ตามที่คุณเรียกใช้งานพื้นฐาน Grunt จะไม่ค้นหาการกำหนดค่าหรือสภาพแวดล้อม แต่จะเรียกใช้ฟังก์ชันงานที่ระบุไว้ แต่จะส่งผ่านอาร์กิวเมนต์ที่คั่นด้วยเครื่องหมายโคลอนที่ระบุเป็นอาร์กิวเมนต์ของฟังก์ชัน

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

ในตัวอย่างต่อไปนี้งานจะบันทึกfoo ทดสอบ 123ว่า Grunt ถูกดำเนินการผ่านคำสั่งgrunt foo: testing: 123 เมื่อใดก็ตามที่งานจะดำเนินการโดยไม่ขัดแย้งเป็นfoo แสมงานจะเข้าสู่ระบบ foo ไม่มี 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);
   }
});

งานที่กำหนดเอง

หากคุณไม่ต้องการทำตามโครงสร้างแบบหลายงานคุณสามารถกำหนดงานที่กำหนดเองได้ดังที่แสดงด้านล่าง -

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

Tasks สามารถเข้าถึงคุณสมบัติการกำหนดค่าดังที่แสดงด้านล่าง -

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