グラントタスクでコマンドを実行する


94

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

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

コマンドラインからこの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
これらの2つのいずれかがWindowsで使用できるかどうか誰かが知っていますか?
Capaj 2013

すぐにgrunt-shellWindows + Cygwinで作業することができませんでしたが、で運が良かったgrunt-execです。
Nathan

3
grunt-execを同期的に使用する方法はありますか?コマンドをチェーンするのは良いことです
funseiki 2014年

1
@funseikiは、コマンドをバッチまたはシェル内に配置するだけで、コマンドを任意の順序で呼び出します。または、mycmdsなどのタスクを定義して書き込むと"exec:cmd1", "exec:cmd2"、同期的に注文することもできます。
セバスチャン

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 paramは配列ではなく文字列でなければなりません。
RKI、2015年

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-shellとgrunt-execは2つの例です。
papercowboy

sh以前sh mayCommand.sh に使用しているように、Windowsで機能するかどうかは
わかり

それはbashスクリプトなので、機能しません。Unix OSで実行しています
JuanO 2013

18

最新のgruntバージョン(この記事の執筆時点では0.4.0rc7)を使用している場合、grunt-execとgrunt-shellの両方が失敗します(最新のgruntを処理するように更新されていないようです)。一方、child_processのexecは非同期であり、面倒です。

最終的にはJake Trentのソリューションを使用し、プロジェクトの開発依存関係として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-shellと正常に動作しているgrunt v0.4.5Windowsの下に
フィアット

shelljsを使用すると、ノードアプリがシェルにアクセスできるようになるため、優れたソリューションであると思います。これにより、面倒なアドオンだけよりもシェルを細かく制御できます。
Nick Steele、

14

Guysは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

私は1日実行タスクを実行するように努めてきましたが、最後に機能する簡単なソリューションです!
ジョニー2018年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.