Chạy lệnh trong Nhiệm vụ Grunt


94

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

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

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

Câu trả lời:


105

Ngoài ra, bạn có thể tải các plugin grunt để giúp điều này:

Ví dụ về grunt-shell :

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

hoặc ví dụ grunt-execute :

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

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

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

3
Có cách nào để sử dụng đồng bộ grunt-exec không? Sẽ rất tuyệt nếu bạn xâu chuỗi các lệnh lại với nhau
funseiki

1
@funseiki chỉ cần đặt các lệnh bên trong một lô hoặc trình bao gọi các lệnh theo thứ tự bạn muốn. Hoặc bạn xác định nhiệm vụ ví dụ như mycmds và viết "exec:cmd1", "exec:cmd2"thì bạn cũng có thứ tự đồng bộ.
Sebastian

35

Kiểm tra grunt.util.spawn:

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

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

2
Lưu ý: tham số cmd phải là một chuỗi không phải là một mảng.
RKI

1
Điều này bây giờ yêu cầu grunt-legacy-utilplugin. Nó khuyên bạn nên sử dụng require('child_process').spawn()thay thế.
JD

19

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

Tôi đang sử dụng grunt dưới nút vì vậy, để gọi các lệnh đầ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 của riêng bạn) để giữ cấu hình grunt của bạn dưới dạng cấu hình chứ không phải mã. grunt-shell & grunt-Operating là hai ví dụ.
papercowboy

Khi bạn sử dụng shtrước khi sh mayCommand.sh tôi không chắc chắn nó sẽ làm việc trên cửa sổ
svassr

Nó sẽ không hoạt động vì nó là tập lệnh bash. Tôi đang chạy dưới Unix OS's
JuanO 17/12/13

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) thì cả grunt-execute 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, thực thi của child_process là không đồng bộ, đây là một rắc rối.

Tôi đã kết thúc bằng cách sử dụng giải pháp của Jake Trent và thêm shelljs làm phần phụ thuộc của nhà phát triển vào dự án của mình để tôi 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.5Windows
fiat

Tôi nghĩ rằng 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 shell và nó cho phép bạn kiểm soát nó tốt hơn so với các addon grunt một mình.
Nick Steele

14

Mọi người đang trỏ child_process, nhưng hãy thử sử dụng executeSync để 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);
});

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

Tôi đã cố gắng thực hiện các tác vụ đang chạy trong một ngày, và cuối cùng một giải pháp đơn giản đã hoạt động!
johnny 5

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.