89

Tôi đang sử dụng Grunt (công cụ tạo dòng lệnh dựa trên nhiệm vụ cho các dự án JavaScript) trong dự án của tôi. Tôi đã tạo ra một thẻ tùy chỉnh và tôi tự hỏi nếu nó có thể chạy một lệnh vào nó.Chạy lệnh trong Công việc Grunt

Để làm rõ, tôi đang cố gắng sử dụng Mẫu đóng và "tác vụ" nên gọi tệp jar để biên dịch trước tệp Soy thành tệp javascript.

Tôi đang chạy bình này từ dòng lệnh, nhưng tôi muốn đặt nó làm tác vụ.

Trả lời

19

Tôi đã tìm thấy giải pháp để tôi muốn chia sẻ với bạn.

Tôi đang sử dụng grunt dưới nút như vậy, để gọi lệnh thiết bị đầu cuối, bạn cần yêu cầu mô-đun 'child_process'.

Ví dụ,

var myTerminal = require("child_process").exec, 
    commandToBeExecuted = "sh myCommand.sh"; 

myTerminal(commandToBeExecuted, function(error, stdout, stderr) { 
    if (!error) { 
     //do something 
    } 
}); 
+12

Một cách tiếp cận tốt hơn là sử dụng một plugin (hoặc viết riêng của bạn) để giữ cho cấu hình grunt của bạn như cấu hình và không mã. grunt-shell & grunt-exec là hai ví dụ. – papercowboy

+0

Khi bạn sử dụng '' 'sh''' trước' '' sh mayCommand.sh '' 'Tôi không chắc chắn nó sẽ hoạt động trên các cửa sổ – svassr

+0

Nó sẽ không hoạt động vì nó là bash scripting. Tôi đang chạy theo hệ điều hành Unix – blackdragon

102

Hoặc bạn có thể tải tại plugins grunt để giúp này:

grunt-shell dụ:

shell: { 
    make_directory: { 
    command: 'mkdir test' 
    } 
} 

hoặc grunt-exec dụ:

exec: { 
    remove_logs: { 
    command: 'rm -f *.log' 
    }, 
    list_files: { 
    command: 'ls -l **', 
    stdout: true 
    }, 
    echo_grunt_version: { 
    command: function(grunt) { return 'echo ' + grunt.version; }, 
    stdout: true 
    } 
} 
+8

Có ai biết nếu một trong hai người đó có thể sử dụng được trên Windows không? – Capaj

+6

Đối với trường hợp đơn giản cả hai đã làm việc tốt cho tôi trong Windows. – eddiegroves

+0

Tôi không thể ngay lập tức nhận được «grunt-shell' để làm việc với Windows + Cygwin nhưng tôi đã may mắn hơn với' grunt-exec'. – Nathan

18

Nếu bạn đang sử dụng phiên bản grunt mới nhất (0.4.0rc7 tại thời điểm viết bài này) cả grunt-exec và grunt-shell đều không thành công (chúng dường như không được cập nhật để xử lý grunt mới nhất). Mặt khác, child_process's exec là không đồng bộ, điều này là một rắc rối.

tôi đã kết thúc bằng Jake Trent's solution, và thêm shelljs như một sự phụ thuộc dev trên dự án của tôi vì vậy tôi chỉ có thể chạy thử nghiệm một cách dễ dàng và đồng bộ:

var shell = require('shelljs'); 

... 

grunt.registerTask('jquery', "download jquery bundle", function() { 
    shell.exec('wget http://jqueryui.com/download/jquery-ui-1.7.3.custom.zip'); 
}); 
+1

fyi 'grunt-shell' đang hoạt động tốt với' grunt v0.4.5' dưới Windows – fiat

+0

Tôi nghĩ rằng việc sử dụng shelljs là một giải pháp tuyệt vời vì nó cho phép ứng dụng nút của bạn truy cập vào trình bao, và nó cho phép bạn kiểm soát tốt hơn so với các add-on grunt một mình. –

34

Check-out grunt.util.spawn:

grunt.util.spawn({ 
    cmd: ['rm'], 
    args: ['-rf', '/tmp'], 
}, function done() { 
    grunt.log.ok('/tmp deleted'); 
}); 
+4

với 'opts: {stdio: 'inherit'},' bạn có thể thấy đầu ra của lệnh – JuanPablo

+1

Lưu ý: param cmd phải là một chuỗi không phải là mảng. – RKI

+0

Điều này hiện yêu cầu plugin ['grunt-legacy-util'] (https://github.com/gruntjs/grunt-legacy-util). Nó khuyên bạn nên sử dụng ['require ('child_process') .spawn()'] (https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options) để thay thế. –

11

Guys đang trỏ child_process, nhưng cố gắng sử dụng execSync để xem kết quả ..

grunt.registerTask('test', '', function() { 
     var exec = require('child_process').execSync; 
     var result = exec("phpunit -c phpunit.xml", { encoding: 'utf8' }); 
     grunt.log.writeln(result); 
}); 
+0

Giải pháp tuyệt vời mà không cần bất kỳ plugin bổ sung nào. – valentinvieriu

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