3

http://gruntjs.com/を使用して、ファイルを反復処理するビルド スクリプトを作成していthemes.jsonます。JSON インクルードは次のようになります。

{
    "vintage" : {
        "_name"        : "vintage",
        "_long_name"   : "Vintage",
        "_js_includes" : [
            "assets/js/plugins/bootstrap/bootstrap-transition.js",
            [...]
            "assets/js/plugins/*.js",
            "assets/js/_*.js"
        ]
    },
    "pure" : {
        "_name"        : "pure",
        "_long_name"   : "Pure",
        "_js_includes" : [
            "assets/js/plugins/bootstrap/bootstrap-transition.js",
            [...]
            "assets/js/plugins/bootstrap/bootstrap-popover.js",
            "assets/js/plugins/*.js",
            "assets/js/_*.js"
        ]
    }, "mystique" : {
        "_name"        : "mystique",
        "_long_name"   : "Mystique",
        "_js_includes" : [
            [...]
            "assets/js/plugins/*.js",
            "assets/js/_*.js"
        ]
    }
}

このファイルgrunt.initConfig

grunt.initConfig({
    themes: '<json:themes.json>',
    [...]

メソッド、問題はmystique、上記の例の配列の最後のテーマが、私が書こうとしているテーマ固有のタスクを何らかの形でオーバーライドしていることです。ここにリンクされているコードのこの行で、ループgrunt themes:pure内で動的に登録しているアクションを実行して取得できるようにしたい:forfor ( var new_key in themesObject ) {

http://jsfiddle.net/6XKrp/3/

とにかく動作しない関連ビットは次のとおりです。

for ( var key in themesObject ) {
    initCommand =  'themes:'+themesObject[thisThemeName]._name; // --> themes:pure
    taskString = themesObject[thisThemeName].taskString // --> lint pure:recess pure:concat pure:min pure:mincss pure:enqueue_ver
    grunt.task.registerMultiTask( initCommand, taskString, function() {
            grunt.log.writeln('Now executing task ['+this.target+'] for '+this.name+' theme...');
            grunt.log.writeln( grunt.log.writeflags( this.data, this.target ) );
            grunt.log.writeln( 'this.file = '+this.file);
     })

上記のコードは、initConfig正しいように見え、themes:[my-theme]実行が実行されているようにテンプレートをログに記録しますが、実際のコマンドの実行は行われず、ログの側面のみが発生します。

関数に taskString を渡し、registerMultiTask関数自体の中でタスク文字列を繰り返す必要がありますか?

registerMultiTask( initCommand, taskString, function( taskString ) { taskString })関数を作成してから、grunt.task.run(taskString)登録された各関数内で実行しますか? この変数を渡す方法は、コマンド ライン入力を受け取ることを目的としていることは理解していますが、登録された関数に文字列を渡す方法はありますか?

JSON構成オブジェクトの最上位を実行しているが、実行が行われるべきであるより深くネストされたJSONに再帰していないという意味で、すべてを「フラット」に実行しているようです...私はここにいますか?

好奇心が強い人のために、これはいくつかの変更を加えた Twitter Bootstrap です。基本的に、ここでの目標は、子テーマを動的に作成themes.jsonし、兄弟のディレクトリにエクスポートして、面倒なタスクとすべてが存在するソースにエクスポートすることです...次のようにする必要があります。

|source-directory
|--assets
|--|--css
|--|--|--bootstrap
|--|--|--|--less
|--|--scripts
|--|--|--plugins
|pure
|--assets
|--|--css
|--|--|--main.js
|--|--|--main.min.js
|--|--js
|--|--|--scripts.js
|--|--|--scripts.min.js
| vintage
|--assets
|--|--css
|--|--|--main.js
|--|--|--main.min.js
|--|--js
|--|--|--scripts.js
|--|--|--scripts.min.js
... etc.

initConfig私が意図している方法でループで空白を埋めるためにどういうわけかうなり声を動的に定義させないというこっそり疑いがありforます...これに光を当てることは大歓迎です!

更新themes:最初に質問を投稿して以来、内部の動的割り当てがinitConfig期待どおりに機能するようになりましたが、現在、テンプレートは必要なものをエコーし​​ていますが、タスク自体は実行されていません。私はそれぞれに結果を記録していますmultiTask(ここのコードを参照 - http://jsfiddle.net/6XKrp/2/this.data )、 (テーマに固有のコマンド->テンプレート)の期待される結果を取得していますが、アクションは定義されています実行していません。

更新 2 : 物事は期待どおりにログに記録され、タスクは現在登録されています。問題は、それらが実行されていないか、JSON オブジェクトのより深いレベルまで再帰的に実行されていないことです。理由はわかりませgrunt.jsん...実行されませんこの方法で呼び出されたときに再帰的に?

4

1 に答える 1

2

本質的に、JSON 構造がトップレベルで交渉不可能であることに気付かずに、私はこれを間違って行っていました。オプションまたは複数のファイル、出力などをトップレベル関数の下にネストできますが、それらのトップレベル JSON データ項目はネイティブ関数と拡張機能用に予約されています。

上記で概説したことをどのように達成できたかの要点は次のとおりです: https://gist.github.com/4294776

于 2012-12-15T13:31:05.100 に答える