web-dev-qa-db-ja.com

Gruntタスクでコマンドを実行する

プロジェクトで Grunt (JavaScriptプロジェクト用のタスクベースのコマンドラインビルドツール)を使用しています。カスタムタグを作成しましたが、コマンドを実行できるかどうか疑問に思っています。

明確にするために、クロージャーテンプレートを使用しようとしています。「タスク」はjarファイルを呼び出して、SoyファイルをJavaScriptファイルにプリコンパイルする必要があります。

このjarをコマンドラインから実行していますが、タスクとして設定したいです。

92
JuanO

私は解決策を見つけたので、あなたと共有したいと思います。

ノードの下でgruntを使用しているので、ターミナルコマンドを呼び出すには、 'child_process'モジュールが必要です。

例えば、

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

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

別の方法として、これを支援するために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
  }
}
104
papercowboy

grunt.util.spawnをご覧ください:

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

最新の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');
});
18
kikito

みんなは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);
});
14
Artjom Kurapov

Grunt 0.4.xで動作する非同期シェルコマンドの場合は、 https://github.com/rma4ok/grunt-bg-Shell を使用します。

2