2013-05-14 11 views
9

私はGrirtfileを設定してソースファイルを解析してPHPファイルを解析してローダーで解析して、ファイル名とパスを動的に把握してからgrunt.initConfig()を実行する必要があります。grunt.initConfig()の前に非同期操作を実行するにはどうすればよいですか?

残念ながら、grunt.initConfig()は非同期で実行されるようには見えないため、呼び出す前に非同期コードを実行する方法はありません。これを達成するためのトリックがあるか、検出ルーチンを同期して書き直す必要がありますか?コールバックが到着する前に実行をブロックする簡単な方法はありますか?

もちろん、this.async()がありますが、initConfig()の場合は動作しません。これを成し遂げるためにどのように任意の良いアイデアは

function findSomeFilesAndPaths(callback) { 
    // async tasks that detect and parse 
    // and execute callback(results) when done 
} 

module.exports = function (grunt) { 
    var config = { 
    pkg: grunt.file.readJSON('package.json'), 
    } 

    findSomeFilesAndPaths(function (results) { 
    config.watch = { 
     coffee: { 
     files: results.coffeeDir + "**/*.coffee", 
     tasks: ["coffee"] 
     // ... 
     } 
    }; 

    grunt.initConfig(config); 

    grunt.loadNpmTasks "grunt-contrib-coffee" 
    // grunt.loadNpmTasks(...); 
    }); 
}; 

ここでストリップダウンの例ですか?

ありがとうございます!

+0

どうなりますか? –

+0

これは私が上記のことでしたか? gruntは私のコールバックを待たないので、grunt.initConfig()などはgruntクライアントが戻る前に呼び出されません。 – leyyinad

+0

ありがとう、私の間違い... –

答えて

2

同期スタイルを書き直して解決しました。 ShellJSは、特に同期的に実行されるシェルコマンドの場合に便利です。

5

グランツが同期しているか、findSomeFilesAndPathsを同期させることができるので、私はそれをタスクとして実行します。

grunt.initConfig({ 
    initData: {}, 
    watch: { 
    coffee: { 
     files: ['<%= initData.coffeeDir %>/**/*.coffee'], 
     tasks: ['coffee'], 
    }, 
    }, 
}); 

grunt.registerTask('init', function() { 
    var done = this.async(); 
    findSomeFilesAndPaths(function(results) { 
    // Set our initData in our config 
    grunt.config(['initData'], results); 
    done(); 
    }); 
}); 

// This is optional but if you want it to 
// always run the init task first do this 
grunt.renameTask('watch', 'actualWatch'); 
grunt.registerTask('watch', ['init', 'actualWatch']); 
+0

ありがとう、カイル、あなたのソリューションは非常にその最小限の例に役立ちます。実際、私はスクリプトやスタイルシートや、自動ダウンロードや圧縮解除のような実行時にしか認識されないたくさんの他のタスクのための複数のディレクトリを持っているかもしれません(これらはすべてレーキでうまくいきましたが、 。私はこれをこのように動作させるかもしれませんが、 'grunt.initConfig()'を呼び出す前に、全体の設定オブジェクトを準備する方がはるかに簡単で洗練されたものになります。これは達成できますか? – leyyinad

+0

グランは同期しているので、残念ながら自分のgrunt-cliを書くことができません。これは上記の解決策よりも面倒です。 –

+0

あなたが正しいと思います。とにかくGitHubで[問題](https://github.com/gruntjs/grunt/issues/783)を開いただけです。 – leyyinad

1

あなたは兵卒でShellJSを使用できる方法の例:あなただけの非同期関数からコールバックでgrunt.initconfigとgrunt.loadnpmtasksなどを置けば

grunt.initConfig({ 
    paths: { 
     bootstrap: exec('bundle show bootstrap-sass').output.replace(/(\r\n|\n|\r)/gm, '') 
    }, 
    uglify: { 
     vendor: { 
      files: { 'vendor.js': ['<%= paths.bootstrap %>/vendor/assets/javascripts/bootstrap/alert.js'] 
     } 
    } 
}); 
関連する問題