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.