grunt.registerTask无法修改全局grunt任务设置

时间:2013-11-29 11:31:08

标签: javascript node.js gruntjs

以下代码读取js内每个子目录app/modules/的内容(例如app / modules / module1 / js /,app / modules / module2 / js /,aso。)

此脚本在不使用最后一个命令grunt.task.run('concat:' + dir);之前工作。 一段时间它现在停止工作,所以我不得不在forEach循环内添加对任务concat的调用。

通常我会在concat配置中保存新配置,稍后调用生成的concat任务。

grunt.registerTask('preparemodulejs', 'iterates over all module directories and compiles modules js files', function() {

    // read all subdirectories from your modules folder
    grunt.file.expand('./app/modules/*').forEach(function(dir){

        // get the current concat config
        var concat = grunt.config.get('concat') || {};

        // set the config for this modulename-directory
        concat[dir] = {
            src: [dir + '/js/*.js', '!' + dir + '/js/compiled.js'],
            dest: dir + '/js/compiled.js'
        };

        // save the new concat config
        grunt.config.set('concat', concat); 
        grunt.task.run('concat:' + dir); // this line is new

    });

});

在最近的版本中,我必须添加一个明确的task.run行?

并且有没有办法将此任务的设置写入现有concat任务的设置中,这样如果我对该配置有其他手动添加,那么对于扫描的每个目录都不会运行这些操作?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

grunt.task.run();尽管它的名字,但不会运行任务。 Grunt始终是同步的,因此grunt.task.run()排队任务在当前任务完成后运行。

所以我会避免在数组中使用grunt.task.run(),而是建立一个后续运行的任务/目标列表:

grunt.registerTask('preparemodulejs', 'iterates over all module directories and compiles modules js files', function() {
  var tasks = [];

  // read all subdirectories from your modules folder
  grunt.file.expand('./app/modules/*').forEach(function(dir){

    // get the current concat config
    var concat = grunt.config.get('concat') || {};

    // set the config for this modulename-directory
    concat[dir] = {
      src: [dir + '/js/*.js', '!' + dir + '/js/compiled.js'],
      dest: dir + '/js/compiled.js'
    };

    // save the new concat config
    grunt.config.set('concat', concat); 
    tasks.push('concat:' + dir);
  });

  // queues the tasks and run when this current task is done
  grunt.task.run(tasks);
});

答案 1 :(得分:1)

我们还可以直接在这里提供配置,以便为具有多个模块的大型项目随时运行不同的任务。即使我们需要处理根目录之外的文件:

grunt.registerTask('publishapp', 'uglify ivapp.js and upload to server', function (){
    var tasks = [];
    grunt.file.expand('../outerdirectory/').forEach(function(dir) {
        // config for uglify that needs to execute before uploading on server
        var uglify = {
            options: {
                compress: {
                    drop_console: true,
                },
                banner: '/* Banner you want to put above js minified code. */\n'
            },
            all: {
                files: [{
                    expand: true,
                    cwd: '../',
                    src: ['somedir/some.js'],
                    dest: 'build',
                    ext: '.js',
                    extDot: 'last'
                }]
            }
        };
        // set grunt config : uglify 
        grunt.config.set('uglify', uglify);
    });
    // prepare a tasks list
    tasks.push('uglify:all');
    tasks.push('exec:publish');

    // execute a tasks to perform
    grunt.task.run(tasks);
});