Menjalankan perintah dalam Tugas Grunt


94

Saya menggunakan Grunt (alat pembuatan baris perintah berbasis tugas untuk proyek JavaScript) dalam proyek saya. Saya telah membuat tag kustom dan saya bertanya-tanya apakah mungkin menjalankan perintah ke dalamnya.

Untuk memperjelas, saya mencoba menggunakan Template Penutupan dan "tugas" harus memanggil file jar untuk melakukan pra-kompilasi file Soy ke file javascript.

Saya menjalankan toples ini dari baris perintah, tetapi saya ingin menetapkannya sebagai tugas.

Jawaban:


105

Atau Anda dapat memuat plugin grunt untuk membantu ini:

contoh grunt-shell :

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

atau contoh grunt-exec :

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
Adakah yang tahu jika salah satu dari keduanya dapat digunakan di Windows?
Capaj

Saya tidak bisa langsung grunt-shellbekerja dengan Windows + Cygwin tetapi saya lebih beruntung grunt-exec.
Nathan

3
Apakah ada cara untuk menggunakan grunt-exec secara sinkron? Alangkah baiknya untuk
merangkai

1
@funseiki cukup letakkan perintah di dalam batch atau shell yang memanggil perintah dalam urutan pilihan Anda. Atau Anda mendefinisikan tugas misalnya mycmds dan menulis "exec:cmd1", "exec:cmd2"maka Anda juga memiliki urutan sinkron.
Sebastian

35

Periksa grunt.util.spawn :

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

5
dengan opts: {stdio: 'inherit'},Anda dapat melihat output dari perintah
JuanPablo

2
Catatan: cmd param harus berupa string, bukan array.
RKI

1
Ini sekarang membutuhkan grunt-legacy-utilplugin. Ini merekomendasikan penggunaan require('child_process').spawn()sebagai gantinya.
JD

19

Saya telah menemukan solusi, jadi saya ingin berbagi dengan Anda.

Saya menggunakan grunt di bawah node jadi, untuk memanggil perintah terminal Anda perlu membutuhkan modul 'child_process'.

Sebagai contoh,

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

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

12
Pendekatan yang lebih baik adalah dengan menggunakan plugin (atau tulis sendiri) untuk menyimpan konfigurasi grunt Anda sebagai config dan bukan kode. grunt-shell & grunt-exec adalah dua contoh.
papercowboy

Seperti yang Anda gunakan shsebelumnya, sh mayCommand.sh saya tidak yakin ini akan berfungsi di windows
svassr

Itu tidak akan berhasil karena itu skrip bash. Saya menjalankan di bawah OS Unix
JuanO

18

Jika Anda menggunakan versi grunt terbaru (0.4.0rc7 pada saat tulisan ini dibuat) baik grunt-exec dan grunt-shell gagal (tampaknya keduanya tidak diperbarui untuk menangani grunt terbaru). Di sisi lain, exec child_process adalah async, yang merepotkan.

Saya akhirnya menggunakan solusi Jake Trent , dan menambahkan shelljs sebagai ketergantungan dev pada proyek saya sehingga saya dapat menjalankan pengujian dengan mudah dan sinkron:

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-shellberfungsi dengan baik di grunt v0.4.5bawah Windows
fiat

Saya pikir menggunakan shelljs adalah solusi yang bagus karena memungkinkan aplikasi node Anda mengakses shell, dan ini memberi Anda kontrol yang lebih baik atasnya daripada addons grunt saja.
Nick Steele

14

Orang-orang menunjuk child_process, tetapi coba gunakan execSync untuk melihat output ..

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

Solusi hebat tanpa plugin tambahan.
valentinvieriu

Saya telah mencoba menjalankan tugas yang berjalan selama sehari, dan akhirnya solusi sederhana yang berhasil!
Johnny 5

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.