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.

JuanO
sumber

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
  }
}
papercowboy
sumber
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');
});
Nick Heiner
sumber
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
    }
});
JuanO
sumber
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');
});
kikito
sumber
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);
});
Artjom Kurapov
sumber
Solusi hebat tanpa plugin tambahan.
valentinvieriu
Saya telah mencoba menjalankan tugas yang berjalan selama sehari, dan akhirnya solusi sederhana yang berhasil!
Johnny 5