9

これで Gruntfile のセットアップが完了し、ソースファイルの解析などの自動検出マジックを実行して、roder でいくつかの PHP ソースを解析し、実行前に知っておく必要があるファイル名とパスを動的に把握することができましたgrunt.initConfig()

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

grunt タスクの内部にはもちろん があります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(...);
  });
};

これを実現するための良いアイデアはありますか?

どうもありがとう!

4

3 に答える 3

6

Gruntは同期なので、または同期できる場合はタスクとして実行します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']);
于 2013-05-14T17:42:13.813 に答える
2

書き直し、同期式で解決。ShellJSは、特にシェル コマンドを同期的に実行する場合に便利です。

于 2013-05-14T21:40:25.723 に答える
1

Grunt で ShellJS を使用する方法の例:

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']
        }
    }
});
于 2014-02-04T15:24:53.743 に答える