gruntjs – 如何让grunt.file.readJSON()等到另一个任务生成文件

我正在设置一系列与RequireJS r.js编译器一起使用的grunt任务:

1)生成目录中所有文件的.json文件列表

2)从文件名中删除“.js”(requirejs需要这个)

3)使用grunt.file.read
JSON()来解析该文件,并在我的requirejs编译任务中用作配置选项.

这是我的gruntfile.js中的相关代码:

module.exports = function (grunt) {
    grunt.initConfig({
    // create automatic list of all js code modules for requirejs to build
    fileslist: {
        modules: {
            dest: 'content/js/auto-modules.json',
            includes: ['**/*.js', '!app.js', '!libs/*'],
            base: 'content/js',
            itemTemplate: '\t{' +
                '\n\t\t"name": "<%= File %>",' +
                '\n\t\t"exclude": ["main"]' +
                '\n\t}',
            itemSeparator: ',\n',
            listTemplate: '[' +
                '\n\t<%= items %>\n' +
                '\n]'
        }
    },
    // remove .js from filenames in module list
    replace: {
       nodotjs: {
           src: ['content/js/auto-modules.json'],
           overwrite: true,
           replacements: [
                { from: ".js", to: "" }
           ]
       } 
    },
    // do the requirejs bundling & minification
    requirejs: {
        compile: {
            options: {
                appDir: 'content/js',
                baseUrl: '.',
                mainConfigFile: 'content/js/app.js',
                dir: 'content/js-build',
                modules: grunt.file.readJSON('content/js/auto-modules.json'),
                paths: {
                    jquery: "empty:",
                    modernizr: "empty:"
                },
                generateSourceMaps: true,
                optimize: "uglify2",
                preserveLicenseComments: false,
                //findNestedDependencies: true,
                wrapShim: true
            }
        }
    }
});
grunt.loadNpmTasks('grunt-fileslist');
grunt.loadNpmTasks('grunt-text-replace');
grunt.loadNpmTasks('grunt-contrib-requirejs');

grunt.registerTask('default', ['fileslist','replace', 'requirejs']);

我遇到了一个问题,如果在我的配置文件加载时“content / js / auto-modules.json”文件尚未存在,则在文件存在之前立即执行file.readJSON()整个任务失败并抛出“错误:无法读取文件”如果文件已经存在,一切都很好.

如何进行此设置,以便任务配置等待在第一个任务中创建该文件,并在尝试加载&之前在第二个任务中进行修改.为其中的第三个任务解析JSON?或者是否有另一种方式(可能使用不同的插件)在一个任务中生成一个json对象,然后将该对象传递给另一个任务?

最佳答案 老帖但我有类似的经历.

我试图加载一些json配置,如:

conf: grunt.file.readJSON('conf.json'),

但是如果这个文件不存在那么它会落入堆中而不会做任何事情.

所以我做了以下加载它并填充默认值,如果它不存在:

    grunt.registerTask('checkConf', 'ensure conf.json is present', function(){
    var conf = {};

    try{
        conf = grunt.file.readJSON('./conf.json');    
    } catch (e){
        conf.foo = "";
        conf.bar = "";
        grunt.file.write("./conf.json", JSON.stringify(conf) );
    }

    grunt.config.set('conf', conf);

});

您仍然可能有一些时间问题,但这种方法可能会帮助有readJSON错误的人.

点赞