Esecuzione di un comando in un'attività Grunt


94

Sto usando Grunt (strumento di compilazione della riga di comando basato su attività per progetti JavaScript) nel mio progetto. Ho creato un tag personalizzato e mi chiedo se sia possibile eseguire un comando in esso.

Per chiarire, sto cercando di utilizzare i modelli di chiusura e "l'attività" dovrebbe chiamare il file jar per precompilare il file Soy in un file javascript.

Sto eseguendo questo jar dalla riga di comando, ma voglio impostarlo come attività.

Risposte:


105

In alternativa puoi caricare plugin di grugnito per aiutare questo:

esempio di grugnito :

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

o esempio 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
Qualcuno sa se uno di questi due è utilizzabile su Windows?
Capaj

Non sono riuscito grunt-shella lavorare immediatamente con Windows + Cygwin ma ho avuto più fortuna con grunt-exec.
Nathan

3
C'è un modo per usare grunt-exec in modo sincrono? Sarebbe bello concatenare i comandi insieme
funseiki

1
@funseiki mette semplicemente i comandi all'interno di un batch o di una shell che chiama i comandi nell'ordine che preferisci. Oppure si definisce l'attività, ad esempio mycmds e si scrive, "exec:cmd1", "exec:cmd2"quindi si dispone anche di un ordine sincrono.
Sebastian il


19

Ho trovato una soluzione quindi mi piacerebbe condividerla con te.

Sto usando grunt sotto il nodo quindi, per chiamare i comandi del terminale è necessario richiedere il modulo 'child_process'.

Per esempio,

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

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

12
Un approccio migliore è usare un plugin (o scrivere il tuo) per mantenere la tua configurazione grugnita come configurazione e non come codice. grunt-shell e grunt-exec sono due esempi.
papercowboy

Come usi shprima, sh mayCommand.sh non sono sicuro che funzionerebbe su Windows
svassr

Non funzionerà perché è uno script bash. Sto funzionando con il sistema operativo Unix
JuanO

18

Se stai usando l'ultima versione di grunt (0.4.0rc7 al momento della stesura di questo documento) sia grunt-exec che grunt-shell falliscono (non sembrano essere aggiornati per gestire l'ultimo grunt). D'altra parte, l'exec di child_process è asincrono, il che è una seccatura.

Ho finito per utilizzare la soluzione di Jake Trent e aggiungere shelljs come dipendenza di sviluppo dal mio progetto in modo da poter eseguire i test facilmente e in modo sincrono:

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-shellfunziona bene con grunt v0.4.5Windows
fiat

Penso che l'uso di shelljs sia un'ottima soluzione perché consente alla tua app del nodo di accedere alla shell e ti dà un controllo più preciso su di essa rispetto ai soli componenti aggiuntivi di grugnito.
Nick Steele

14

I ragazzi stanno indicando child_process, ma prova a usare execSync per vedere l'output ..

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

Ottima soluzione senza plug-in aggiuntivi.
valentinvieriu

Ho cercato di eseguire attività in esecuzione per un giorno e finalmente una soluzione semplice che funziona!
johnny 5

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.