9

现在我有我的 Gruntfile 设置来执行一些自动检测魔术,比如解析源文件来解析 roder 中的一些 PHP 源,以动态找出我在运行之前需要知道的文件名和路径grunt.initConfig()

不幸的是grunt.initConfig(),似乎并不意味着要异步运行,所以我看不到在调用异步代码之前执行异步代码的方法。有没有办法做到这一点,还是我必须同步重写我的检测程序?在我的回调到达之前,有什么简单的方法可以阻止执行吗?

里面当然有 grunt tasks 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派上了用场,尤其是对于同步执行 shell 命令。

于 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 回答