Grunt从文件重新加载JSON并更新任务选项

时间:2014-07-08 08:47:36

标签: javascript json gruntjs

我正在使用一个JSON格式的配置文件,其中包含其中一个文件更改时我连接的其他文件的名称。它到目前为止工作得很好,但我想让Grunt在配置文件更改后重新加载(我删除或添加一些内容到JSON)并更新其他任务选项(concat任务)。

这是我简化的Gruntfile.js:

module.exports = function(grunt) {
    function getModules() {
        var modules = grunt.file.readJSON('src/js/modules.json').modules;
        for ( var module in modules ) {
            if ( modules.hasOwnProperty(module) ) {
                modules[module] = 'src/js/modules/' + modules[module] + '.js';
            }
        }
        modules.push('src/js/scripts.js');
        return modules;
    }
    var modules = getModules();

    grunt.initConfig({
        concat: {
            options: {
                separator: ';',
            },
            dist: {
                src: modules,
                dest: 'assets/js/scripts.min.js',
            },
        },

        watch: {
            js_modules: {
                files: ['src/js/modules.json'],
                tasks: ['reload_modules', 'concat'],
                options: {
                    spawn: false,
                    livereload: true,
                },
            }
        }
    });

    grunt.registerTask('reload_modules', "Reload JavaScript modules", function() {
        modules = getModules();
    });
};

正如您所看到的,我尝试解决了我的问题,但modules任务中未使用更新的concat变量。该任务使用启动grunt默认任务时加载的变量值。

1 个答案:

答案 0 :(得分:1)

您应该能够使用grunt.config.merge覆盖配置:

var config = {
    // ...
};

grunt.config.init(config);

grunt.registerTask('reload_modules', "Reload JavaScript modules", function() {
    config.concat.options.dist.src = getModules();
    grunt.config.merge(config);
});

http://gruntjs.com/api/grunt.config