2

実行時に Grunt ファイル内にコマンド ライン オプションを追加して評価するにはどうすればよいですか?

私はこれを試しました:

module.exports = function(grunt) {
  var cli = grunt.cli;

  cli.optlist["environment"] = {
    "short": "E",
    info: "Build environment",
    type: String
  };

  // This only outputs "environment=abc" if Grunt was called with
  //   --environment, with -E it returns "environment=undefined"
  console.log("environment=" + grunt.option("environment"));

  grunt.initConfig({ ... });

...
}

--environmentスイッチを使用している限り機能します。使用する-Eと、grunt.option()未定義が返されます。不思議なことに、新しいオプションが--help画面に表示されます。

明らかに、オプション オブジェクトは一度だけ初期化されます: https://github.com/gruntjs/grunt/blob/0.3-stable/lib/grunt/cli.js#L105。long switch オプションを使用すると、結局、新しいオプションが評価される理由がわかりません。

新しいオプションを追加した後、オプションを再解析する必要があると思いました。grunt.tasks()を再度呼び出すことはできましたが、期待どおりに機能しません。

進入禁止。より良い方法は何ですか?

Grunt ヘルパーまたはタスクを作成するときに同じ制限がありますか? Grunt 内部で変更する必要があるのは一般的な制限ですか?

この質問は次のものに関連しています。

  • Grunt 0.3.15+ (私が見る限り、0.4.x にも適用されるはずです)
  • ノード 0.6.18

編集

Grunt をもう少しリバース エンジニアリングし、実行時にオプションを追加できるように Grunt 自体を変更しようとしました。

Grunt での変更は多すぎて誤解を招くため、スキップします。変更点をまとめて説明します。

これまでのところ、これは私の Grunt ファイルです。

grunt.addOptions({
    "environment": {
            "short": "L",
            info: "Build environment",
            type: String
    }
});

addOptions()渡されたオプションをオブジェクトに追加しようとした後optlist、オプション オブジェクトを再解析しました。ここのコードを、初期化時と最後に呼び出されるメソッドにラップするだけで、再解析が行われましたaddOptions()

これまでの私の実装では問題は解決しません。Grunt の内部依存構造では、Grunt ファイルの読み込みと解析 (解析されたコマンド ライン オプションが必要) が許可されず、コマンド ライン オプションの構成をさらに初期化する (これが私のアプローチでした) ため、Grunt であまりにも多くの変更を加える必要があります。

Grunt ファイルのカスタム オプションの提供については、GitHub の Grunt 開発者と話し合う必要があると思います。

これまでの私の答え

じゃあ何て答えるんだろう…

上記の私の例は、長いオプションを使用できる限り正しく、適切です。

詳細がわかり次第、この質問を更新します。:)

4

2 に答える 2

3

何かが足りないかもしれませんが、両方でテストする必要があります。

var environment = grunt.option("E") || grunt.option("environment");
于 2012-12-30T20:42:42.670 に答える
0

使用するコマンド ライン引数の量が増えると、grunt が内部で使用するいくつかの引数との衝突に遭遇することに注意してください。

nopt-gruntでこの問題を回避しました

プラグインの作者から:

グラントは素晴らしいです。追加のコマンド ライン オプションを使用するための Grunt のサポートは素晴らしいものではありません。現在のドキュメントは、ブール値のフラグとオプションを値で使用する例を示しているという点で誤解を招くものですが、単一のオプションでのみそのように機能することは説明していません。複数のオプションを試してみると、物事はすぐにバラバラになります。

*** 以前にも投稿しましたが、コマンド ライン引数で非常に苦労しました。「grunt のコマンド ライン引数」をグーグルで検索すると、これはかなり上位にランクされています。

于 2015-01-09T17:16:48.333 に答える