Executando um comando em uma Tarefa Grunt

94

Estou usando o Grunt (ferramenta de construção de linha de comando baseada em tarefas para projetos JavaScript) no meu projeto. Eu criei uma tag personalizada e gostaria de saber se é possível executar um comando nela.

Para esclarecer, estou tentando usar modelos de closure e "a tarefa" deve chamar o arquivo jar para pré-compilar o arquivo Soy para um arquivo javascript.

Estou executando este jar na linha de comando, mas quero defini-lo como uma tarefa.

JuanO
fonte

Respostas:

105

Alternativamente, você pode carregar plug-ins Grunt para ajudar nisso:

exemplo grunt-shell :

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

ou exemplo 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
  }
}
papercowboy
fonte
9
Alguém sabe se algum desses dois pode ser usado no Windows?
Capaj
Não consegui começar grunt-shella trabalhar imediatamente com o Windows + Cygwin, mas tive mais sorte com o grunt-exec.
Nathan
3
Existe uma maneira de usar o grunt-exec de forma síncrona? Seria bom encadear comandos juntos
funseiki
1
@funseiki apenas coloca os comandos dentro de um lote ou shell que chama os comandos em sua ordem preferida. Ou você define a tarefa, por exemplo, mycmds e escreve, "exec:cmd1", "exec:cmd2"então você também tem a ordem síncrona.
Sebastian
35

Confira grunt.util.spawn:

grunt.util.spawn({
  cmd: 'rm',
  args: ['-rf', '/tmp'],
}, function done() {
  grunt.log.ok('/tmp deleted');
});
Nick Heiner
fonte
5
com opts: {stdio: 'inherit'},você pode ver a saída do comando
JuanPablo
2
Observação: o parâmetro cmd deve ser uma string, não uma matriz.
RKI
1
Isso agora requer o grunt-legacy-utilplugin. Ele recomenda usar em seu require('child_process').spawn()lugar.
JD
19

Eu encontrei uma solução que gostaria de compartilhar com vocês.

Estou usando o grunt sob o nó, portanto, para chamar comandos de terminal, você precisa exigir o módulo 'child_process'.

Por exemplo,

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

myTerminal(commandToBeExecuted, function(error, stdout, stderr) {
    if (!error) {
         //do something
    }
});
JuanO
fonte
12
Uma abordagem melhor é usar um plugin (ou escrever o seu próprio) para manter sua configuração grunt como configuração e não como código. grunt-shell e grunt-exec são dois exemplos.
papercowboy de 01 de
Como você usou shantes, sh mayCommand.sh não tenho certeza se funcionaria no Windows
svassr
Não funcionará porque é script bash. Estou executando em sistemas operacionais Unix
JuanO
18

Se você estiver usando a versão mais recente do grunt (0.4.0rc7 no momento em que este livro foi escrito), o grunt-exec e o grunt-shell falham (eles não parecem estar atualizados para lidar com o grunt mais recente). Por outro lado, o exec de child_process é assíncrono, o que é um incômodo.

Acabei usando a solução de Jake Trent e adicionando shelljs como uma dependência de desenvolvimento em meu projeto para que eu pudesse apenas executar testes de forma fácil e síncrona:

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
fonte
1
fyi grunt-shellestá funcionando bem grunt v0.4.5no Windows
fiat
Acho que usar shelljs é uma ótima solução porque permite que seu aplicativo de nó acesse o shell e oferece um controle mais preciso sobre ele do que apenas os addons grunt.
Nick Steele,
14

Caras estão apontando child_process, mas tente usar execSync para ver a saída.

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
fonte
Ótima solução sem plug-ins adicionais.
valentinvieriu
Estou tentando executar tarefas em execução há um dia e, finalmente, uma solução simples que funciona!
johnny 5 de