実行時に 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 開発者と話し合う必要があると思います。
これまでの私の答え
じゃあ何て答えるんだろう…
上記の私の例は、長いオプションを使用できる限り正しく、適切です。
詳細がわかり次第、この質問を更新します。:)