Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I perform an asynchronous operation before grunt.initConfig()?

Now I have my Gruntfile setup to perform some automatic detection magic like parsing sourcefiles to parse some PHP sources in roder to dynamically figure out filenames and paths I need to know before running grunt.initConfig().

Unfortunately grunt.initConfig() doesn't seem to be meant to be run asynchronously, so I see no way to have my asynchronous code executed before I can call it. Is there a trick to accomplish this or do I have to rewrite my detection routines synchronously? Is there any easy way to block execution before my callback has arrived?

Inside grunt tasks there is of course this.async(), but for initConfig() that doesn't work.

Here's a stripped down example:

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(...);
  });
};

Any good ideas how to get this done?

Thanks a lot!

like image 770
leyyinad Avatar asked May 14 '13 15:05

leyyinad


2 Answers

I would do it as a task since Grunt is sync or if you can make findSomeFilesAndPaths sync.

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']);
like image 78
Kyle Robinson Young Avatar answered Nov 02 '22 02:11

Kyle Robinson Young


Solved by rewriting, synchronous style. ShellJS came in handy, especially for synchronously executing shell commands.

like image 2
leyyinad Avatar answered Nov 02 '22 02:11

leyyinad