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.

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
  }
}

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');
});

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
    }
});

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');
});

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);
});

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.