Grunt Task'ta bir komut çalıştırma


94

Ben kullanıyorum Grunt Projemdeki (JavaScript projeleri için görev tabanlı bir komut satırı aracı inşa). Özel bir etiket oluşturdum ve içine bir komut çalıştırmanın mümkün olup olmadığını merak ediyorum.

Açıklığa kavuşturmak için, Kapanış Şablonlarını kullanmaya çalışıyorum ve "görev", Soy dosyasını bir javascript dosyasına önceden derlemek için jar dosyasını çağırmalı.

Bu jar'i komut satırından çalıştırıyorum, ancak onu bir görev olarak ayarlamak istiyorum.

Yanıtlar:


105

Alternatif olarak, buna yardımcı olmak için grunt eklentileri yükleyebilirsiniz:

grunt-shell örneği:

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

veya grunt-exec örneği:

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
Bu ikisinden birinin Windows'ta kullanılabilir olup olmadığını bilen var mı?
Capaj

grunt-shellWindows + Cygwin ile hemen çalışmaya başlayamadım ama şansım yaver gitti grunt-exec.
Nathan

3
Grunt-exec'i eşzamanlı olarak kullanmanın bir yolu var mı? Komutları birlikte zincirlemek güzel olurdu
funseiki

1
@funseiki, komutları tercih ettiğiniz sırada çağıran bir toplu iş veya kabuğun içine koyun. Ya da, örneğin mycmds gibi bir görevi tanımlarsınız ve "exec:cmd1", "exec:cmd2"ardından eşzamanlı olarak sipariş verirsiniz.
Sebastian

35

Kontrol edin grunt.util.spawn:

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

5
ile opts: {stdio: 'inherit'},komutun çıktısını görebilirsiniz
JuanPablo

2
Not: cmd parametresi bir dizi değil bir dize olmalıdır.
RKI

1
Bu artık grunt-legacy-utileklentiyi gerektiriyor . Bunun require('child_process').spawn()yerine kullanılmasını önerir .
JD

19

Bir çözüm buldum, bu yüzden sizinle paylaşmak istiyorum.

Düğüm altında grunt kullanıyorum, bu yüzden terminal komutlarını çağırmak için 'child_process' modülüne ihtiyacınız var.

Örneğin,

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

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

12
Grunt yapılandırmanızı kod değil yapılandırma olarak tutmak için bir eklenti kullanmak (veya kendi yazınızı yazmak) daha iyi bir yaklaşımdır. grunt-shell & grunt-exec iki örnektir.
papercowboy

Daha shönce kullandığınız gibi sh mayCommand.sh , pencerelerde çalışacağından emin değilim
svassr

İşe yaramayacak çünkü bu bash betikleri. Unix
OS'ler

18

En son grunt sürümünü kullanıyorsanız (bu yazının yazıldığı sırada 0.4.0rc7) hem grunt-exec hem de grunt-shell başarısız olur (en son grunt ile başa çıkacak şekilde güncellenmemiş gibi görünüyorlar). Öte yandan, child_process'in exec eşzamansızdır ve bu bir güçlüktür.

Jake Trent'in çözümünü kullandım ve projeme bir geliştirici bağımlılığı olarak shellj'leri ekledim , böylece testleri kolayca ve eşzamanlı olarak çalıştırabildim:

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 Windows altında grunt-shellsorunsuz çalışıyorgrunt v0.4.5
fiat

Shelljs kullanmanın harika bir çözüm olduğunu düşünüyorum çünkü düğüm uygulamanızın kabuğa erişmesini sağlıyor ve size onun üzerinde tek başına grunt eklentilerinden daha iyi kontrol sağlıyor.
Nick Steele

14

Çocuklar child_process'i işaret ediyor, ancak çıktıyı görmek için execSync'i kullanmayı deneyin ..

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

Herhangi bir ek eklenti olmadan harika bir çözüm.
valentinvieriu

Bir gündür çalışan görevleri çalıştırmaya çalışıyorum ve sonunda işe yarayan basit bir çözüm!
johnny 5

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.