Grunt 태스크에서 명령 실행


94

내가 사용하고 그런트 내 프로젝트에 (자바 스크립트 프로젝트를위한 작업 기반 명령 줄 빌드 도구). 사용자 지정 태그를 만들었고 여기에 명령을 실행할 수 있는지 궁금합니다.

명확히하기 위해 클로저 템플릿을 사용하려고하는데 "작업"은 jar 파일을 호출하여 Soy 파일을 자바 스크립트 파일로 미리 컴파일해야합니다.

명령 줄에서이 jar를 실행하고 있지만 작업으로 설정하고 싶습니다.

답변:


105

또는 다음을 돕기 위해 grunt 플러그인을로드 할 수 있습니다.

grunt-shell 예 :

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

또는 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
이 두 가지 중 하나를 Windows에서 사용할 수 있는지 아는 사람이 있습니까?
Capaj 2013-04-25

grunt-shellWindows + Cygwin으로 즉시 작업 할 수 는 없었지만 grunt-exec.
Nathan

3
grunt-exec를 동 기적으로 사용하는 방법이 있습니까? 명령을 함께 연결하는 것이 좋을 것입니다
funseiki 2014 년

1
@funseiki는 원하는 순서로 명령을 호출하는 배치 또는 셸 안에 명령을 넣습니다. 또는 mycmds와 같은 작업을 정의하고 작성 "exec:cmd1", "exec:cmd2"하면 동기식으로 주문할 수도 있습니다.
Sebastian

35

확인 grunt.util.spawn:

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

5
함께 opts: {stdio: 'inherit'},당신은 명령의 출력을 볼 수 있습니다
JuanPablo

2
참고 : cmd 매개 변수는 배열이 아닌 문자열이어야합니다.
RKI

1
이제 grunt-legacy-util플러그인 이 필요합니다 . require('child_process').spawn()대신 사용 하는 것이 좋습니다 .
JD

19

해결책을 찾았으므로 여러분과 공유하고 싶습니다.

노드 아래에서 grunt를 사용하고 있으므로 터미널 명령을 호출하려면 'child_process'모듈이 필요합니다.

예를 들면

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

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

12
더 나은 방법은 플러그인을 사용하거나 직접 작성하여 grunt 구성을 코드가 아닌 구성으로 유지하는 것입니다. grunt-shell과 grunt-exec는 두 가지 예입니다.
papercowboy

사용으로 shsh mayCommand.sh 잘 모르겠어요 그것은 창에 작동합니다
svassr

bash 스크립팅이기 때문에 작동하지 않습니다. 저는 Unix OS에서 실행 중입니다
JuanO

18

최신 grunt 버전 (이 글 작성 당시 0.4.0rc7)을 사용하는 경우 grunt-exec 및 grunt-shell 모두 실패합니다 (최신 grunt를 처리하도록 업데이트되지 않은 것 같습니다). 반면에 child_process의 exec는 비동기이므로 번거 롭습니다.

결국 Jake Trent의 솔루션 을 사용하고 내 프로젝트에 대한 dev 종속성으로 shelljs 를 추가하여 테스트를 쉽고 동 기적으로 실행할 수있었습니다.

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-shellgrunt v0.4.5Windows 에서 잘 작동합니다
fiat

shelljs를 사용하면 노드 앱이 셸에 액세스 할 수 있고 grunt 애드온 만 사용하는 것보다 더 세밀하게 제어 할 수 있기 때문에 훌륭한 솔루션이라고 생각합니다.
Nick Steele

14

남자들은 child_process를 가리키고 있지만 execSync 를 사용 하여 출력을 확인하십시오.

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

추가 플러그인이없는 훌륭한 솔루션입니다.
valentinvieriu

나는 하루 동안 실행중인 작업을 실행하려고 노력했고 마침내 작동하는 간단한 솔루션을 얻었습니다!
johnny 5

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.