Gruntfile.js动态构建文件对象

时间:2013-09-16 04:48:46

标签: gruntjs

问题:在Grunt项目的“配置任务”页面上,“文件对象格式”指定任务的文件工作方式,而“文件阵列格式”,以及关键的“动态构建文件对象的方式(参见其列表中的“dynamic_mappings”部分)没有。

问题:为什么列表#2不起作用?是Grunt页面上的动态文件构建示例错了吗?

参考 Configuring Tasks / Building the Files Object Dynamically 的Grunt项目页面。

底部是Gruntfile.js的两个列表。第一个不起作用,而第二个起作用。它们之间的唯一区别在于每个如何指定“文件”任务:

files: [{
  expand: true,
  cwd: 'views/',
  src: ['**/*.jade'],
  dest: 'html/',
  ext: 'html',
}],

......有效的那个:

files: {
  expand: true,
  cwd: 'views/',
  src: ['**/*.jade'],
  dest: 'html/',
  ext: 'html',
},

唯一的区别在于是否存在“[”和“]”。

第二个列表不起作用,但是遵循Grunt项目页面 Configuring Tasks / Building the Files Object Dynamically 的示例。

列表#1(不起作用): 中止“警告:对象#没有方法'indexOf'使用--force继续。”

module.exports = function(grunt) {

    grunt.initConfig({

        jade: {
            options: { pretty: true,
                data: {
                  debug: true,
                  timestamp: "<%= grunt.template.today() %>"
                }
            },
            files: [{
              expand: true,
              cwd: 'views/',
              src: ['**/*.jade'],
              dest: 'html/',
              ext: 'html',
            }],
        },

        watch: {
            html: {
                files: ['handlers/**/*.js', 'views/**/*.jade', 'app.js'],
                tasks: ['jade']
            }
        }
    });

    grunt.loadNpmTasks('grunt-contrib-jade');
    grunt.loadNpmTasks('grunt-contrib-watch');

    grunt.registerTask('default', ['jade', 'watch']);

}

列表#2(有效)

module.exports = function(grunt) {

    grunt.initConfig({

        jade: {
            options: { pretty: true,
                data: {
                  debug: true,
                  timestamp: "<%= grunt.template.today() %>"
                }
            },
            files: {
              expand: true,
              cwd: 'views/',
              src: ['**/*.jade'],
              dest: 'html/',
              ext: 'html',
            },
        },

        watch: {
            html: {
                files: ['handlers/**/*.js', 'views/**/*.jade', 'app.js'],
                tasks: ['jade']
            }
        }
    });

    grunt.loadNpmTasks('grunt-contrib-jade');
    grunt.loadNpmTasks('grunt-contrib-watch');

    grunt.registerTask('default', ['jade', 'watch']);

}
  • “lucky”=在周末阅读了数百页有关解析错误,咕噜声,玉石,快递,JavaScript,函数和对象的内容......最后决定由于每一次合理的努力都失败了,唯一剩下的就是不合理的。

2 个答案:

答案 0 :(得分:4)

回答(在我发布问题后添加):

CONFIG(grunt.initConfig)所需的结构是:

 CONFIG
    TASK
       TARGET
          FILES               // MUST be child of a target
          OPTIONS             // MUST be child of a target

所以这不应该起作用(但是......我很幸运*):

 grunt.initConfig
    jade: {
       files: {...           // all info content required for jade...
     options: ...            // is specified in these two elements

......这应该不起作用(并且......不......哇!):

 grunt.initConfig
    jade: {
       files: [ {...
     options: ...

最后,这应该并且确实有效(哈利路亚):

 grunt.initConfig
    jade: {
      foo: {      // MUST have target, though no addn'l info added. why? just because.
         files: ...
         options: ...

答案 1 :(得分:1)

我遇到了类似的问题,并在此帖子中找到了答案(在重新排列此处发布的结构后)

Referring to Grunt targets resulting in Warning: Object true has no method 'indexOf'

基本上,答案是将files指令的定义部分包装为数组。 而不是

files:{...}  

使用

files:[{...}]