2013-06-11 36 views
16

Để tùy chỉnh các tác vụ grunt của tôi, tôi cần truy cập vào tên tác vụ grunt được cung cấp trên dòng lệnh khi bắt đầu grunt.Làm thế nào để có được tên tác vụ grunt được đưa ra trên dòng lệnh?

Các tùy chọn là không có vấn đề, kể từ khi nó được ghi nhận đầy đủ (grunt.options). Nó cũng được ghi lại cách tìm tên tác vụ, khi chạy tác vụ grunt.

Nhưng tôi cần quyền truy cập vào tên tác vụ trước đây.

Ví dụ, người dùng viết grunt build --target=client

Khi cấu hình công việc grunt trong Gruntfile.js của tôi, tôi có thể sử dụng grunt.option('target') để có được 'client'.

Nhưng làm cách nào để giữ thông số build trước khi bắt đầu xây dựng nhiệm vụ?

Mọi hướng dẫn đều được đánh giá cao!

Trả lời

25

Tệp grunt của bạn về cơ bản chỉ là một chức năng. Hãy thử thêm dòng này lên trên cùng:

module.exports = function(grunt) { 
/*==> */ console.log(grunt.option('target')); 
/*==> */ console.log(grunt.cli.tasks); 

// Add your pre task code here... 

Chạy với grunt build --target=client sẽ cho bạn kết quả:

client 
[ 'build' ] 

Vào thời điểm đó, bạn có thể chạy bất kỳ mã bạn cần trước khi nhiệm vụ của bạn là chạy bao gồm thiết lập các giá trị với các phụ thuộc mới.

+0

Câu trả lời này chính xác là bây giờ nó đã được chỉnh sửa. Để xem tên tác vụ được đưa ra từ dòng lệnh, sử dụng: console.log (grunt.cli.tasks); nhiệm vụ là một mảng – Zane

1

Bạn có thể sử dụng grunt.util.hooker.hook cho việc này.

Ví dụ (một phần của Gruntfile.coffee):

grunt.util.hooker.hook grunt.task, (opt) -> 
    if grunt.task.current and grunt.task.current.nameArgs 
    console.log "Task to run: " + grunt.task.current.nameArgs 

CMD:

C:\some_dir>grunt concat --cmp my_cmp 
Task to run: concat 
Running "concat:coffee" (concat) task 
Task to run: concat:coffee 
File "core.coffee" created. 

Done, without errors. 

Ngoài ra còn có một hack mà tôi đã sử dụng để ngăn chặn thực hiện nhiệm vụ nhất định:

grunt.util.hooker.hook grunt.task, (opt) -> 
    if grunt.task.current and grunt.task.current.nameArgs 
    console.log "Task to run: " + grunt.task.current.nameArgs 
    if grunt.task.current.nameArgs is "<some task you don't want user to run>" 
     console.log "Ooooh, not <doing smth> today :(" 
     exit() # Not valid. Don't know how to exit :), but will stop grunt anyway 

CMD, khi được phép:

C:\some_dir>grunt concat:coffee --cmp my_cmp 
Running "concat:coffee" (concat) task 
Task to run: concat:coffee 
File "core.coffee" created. 

Done, without errors. 

CMD, khi ngăn cản:

C:\some_dir>grunt concat:coffee --cmp my_cmp 
Running "concat:coffee" (concat) task 
Task to run: concat:coffee 
Ooooh, not concating today :(
Warning: exit is not defined Use --force to continue. 

Aborted due to warnings. 
2

Cách tốt hơn là sử dụng grunt.task.current trong đó có thông tin về nhiệm vụ hiện đang chạy, bao gồm một tài sản name. Trong một nhiệm vụ, ngữ cảnh (ví dụ: this) là cùng một đối tượng. Vì thế . . .

grunt.registerTask('foo', 'Foobar all the things', function() { 
    console.log(grunt.task.current.name); // foo 
    console.log(this.name); // foo 
    console.log(this === grunt.task.current); // true 
}); 

Nếu build là một bí danh cho các nhiệm vụ khác và bạn chỉ muốn biết lệnh gì đã gõ mà dẫn đến việc thực hiện nhiệm vụ hiện tại, tôi thường sử dụng process.argv[2].Nếu bạn kiểm tra process.argv, bạn sẽ thấy rằng argv[0]node (vì grunt là một quá trình node), argv[1]grunt, và argv[2] là nhiệm vụ grunt thực tế (tiếp theo bất kỳ params trong phần còn lại của argv).

EDIT:

Ví dụ đầu ra từ console.log(grunt.task.current) trên [email protected] từ bên trong một nhiệm vụ (không thể có một nhiệm vụ hiện tại từ không phải là một nhiệm vụ hiện hành).

{ 
    nameArgs: 'server:dev', 
    name: 'server', 
    args: [], 
    flags: {}, 
    async: [Function], 
    errorCount: [Getter], 
    requires: [Function], 
    requiresConfig: [Function], 
    options: [Function], 
    target: 'dev', 
    data: { options: { debugPort: 5858, cwd: 'server' } }, 
    files: [], 
    filesSrc: [Getter] 
} 
+0

'grunt.task.current' cho tôi' undefined' với grunt 0.4.5. Phiên bản bạn đang sử dụng? – theUtherSide

+0

0.4.5. Bạn đang làm điều đó từ bên trong một nhiệm vụ? Nguyên nhân nếu không, thì "không xác định" có ý nghĩa. Tôi sẽ thêm đầu ra của tôi ở trên (quá lộn xộn cho một bình luận). – tandrewnichols

+0

Cảm ơn bạn đã làm rõ, tôi đã ở trong 'module.exports = function (grunt) {...', nhưng bên ngoài 'grunt.initConfig ...'. Có vẻ như 'grunt.task.current' không có sẵn ở đó. – theUtherSide

Các vấn đề liên quan