Ausführen eines Befehls in einer Grunzaufgabe

94

Ich verwende Grunt (aufgabenbasiertes Befehlszeilen-Build-Tool für JavaScript-Projekte) in meinem Projekt. Ich habe ein benutzerdefiniertes Tag erstellt und frage mich, ob es möglich ist, einen Befehl darin auszuführen.

Zur Verdeutlichung versuche ich, Abschlussvorlagen zu verwenden, und "die Aufgabe" sollte die JAR-Datei aufrufen, um die Soja-Datei in eine Javascript-Datei vorkompilieren zu können.

Ich führe dieses JAR über die Befehlszeile aus, möchte es jedoch als Aufgabe festlegen.

JuanO
quelle

Antworten:

105

Alternativ können Sie Grunz-Plugins laden, um dies zu unterstützen:

Grunzschalenbeispiel :

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

oder grunt-exec Beispiel:

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
quelle
9
Weiß jemand, ob einer dieser beiden unter Windows verwendbar ist?
Capaj
Ich konnte nicht sofort grunt-shellmit Windows + Cygwin arbeiten, hatte aber besseres Glück damit grunt-exec.
Nathan
3
Gibt es eine Möglichkeit, grunt-exec synchron zu verwenden? Es wäre schön, Befehle miteinander zu
verketten
1
@funseiki fügt die Befehle einfach in einen Stapel oder eine Shell ein, die die Befehle in der von Ihnen bevorzugten Reihenfolge aufruft. Oder du definierst Aufgabe zB mycmds und schreibst "exec:cmd1", "exec:cmd2"dann hast du auch synchron Reihenfolge.
Sebastian
35

Check out grunt.util.spawn:

grunt.util.spawn({
  cmd: 'rm',
  args: ['-rf', '/tmp'],
}, function done() {
  grunt.log.ok('/tmp deleted');
});
Nick Heiner
quelle
5
mit opts: {stdio: 'inherit'},können Sie die Ausgabe des Befehls sehen
JuanPablo
2
Hinweis: cmd param sollte eine Zeichenfolge und kein Array sein.
RKI
1
Dies erfordert nun das grunt-legacy-utilPlugin. Es wird empfohlen, require('child_process').spawn()stattdessen zu verwenden.
JD
19

Ich habe eine Lösung gefunden, die ich gerne mit Ihnen teilen möchte.

Ich verwende grunt under node. Um Terminalbefehle aufzurufen, benötigen Sie das Modul 'child_process'.

Beispielsweise,

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

myTerminal(commandToBeExecuted, function(error, stdout, stderr) {
    if (!error) {
         //do something
    }
});
JuanO
quelle
12
Ein besserer Ansatz ist es, ein Plugin zu verwenden (oder ein eigenes zu schreiben), um Ihre Grunzkonfiguration als Konfiguration und nicht als Code beizubehalten. grunt-shell & grunt-exec sind zwei Beispiele.
Papercowboy
Wie Sie shzuvor verwenden, sh mayCommand.sh bin ich nicht sicher, ob es unter Windows
funktionieren
Es wird nicht funktionieren, weil es Bash-Scripting ist. Ich
laufe
18

Wenn Sie die neueste Grunzversion (0.4.0rc7 zum Zeitpunkt dieses Schreibens) verwenden, schlagen sowohl grunt-exec als auch grunt-shell fehl (sie scheinen nicht aktualisiert zu sein, um das neueste Grunzen zu verarbeiten). Auf der anderen Seite ist die Ausführung von child_process asynchron, was ein Ärger ist.

Am Ende habe ich die Lösung von Jake Trent verwendet und Shelljs als Entwicklungsabhängigkeit von meinem Projekt hinzugefügt, damit ich einfach und synchron Tests ausführen kann:

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
quelle
1
fyi grunt-shellfunktioniert gut mit grunt v0.4.5unter Windows
fiat
Ich denke, die Verwendung von shelljs ist eine großartige Lösung, da Ihre Knoten-App auf die Shell zugreifen kann und Sie eine bessere Kontrolle darüber haben als die Grunz-Addons allein.
Nick Steele
14

Jungs zeigen auf child_process, versuchen aber, execSync zu verwenden, um die Ausgabe zu sehen.

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
quelle
Tolle Lösung ohne zusätzliche Plugins.
Valentinvieriu
Ich habe einen Tag lang versucht, laufende Aufgaben auszuführen, und schließlich eine einfache Lösung, die funktioniert!
Johnny 5