1

我是一个 gruntjs 新手,正在尝试为 JS 前端编写构建。设置了一个要求,以便所有进入构建过程(连接、缩小)的源文件都必须在外部文件中定义:

|-config
  |- js.json
|-src
  |- js
     |- a.js
     |- b.js
|- Gruntfile.js
|- package.json

我已经简化了项目结构来说明问题。config/js.json看起来像这样:

[
   "<%=js_dir%>/a.js",
   "<%=js_dir%>/b.js"
]

Gruntfile.js看起来像这样:

module.exports = function(grunt) {

grunt.initConfig({
    concat: {
        "options": {"separator": ";"},
        "build": {
            "src": "<%= grunt.template.process(grunt.file.read('./config/js.json'),{data: {js_dir: './src/js'}})%>"
                    ,
            "dest": "build/app.js"
        }
    }
});

grunt.loadNpmTasks('grunt-contrib-concat');

grunt.registerTask('default', ['concat']);
};

当我运行它时,会生成一个空的输出文件,因为源列表是空的:

...
Reading ./config/js.json...OK
Files: [no src] -> build/app.js
Reading ./config/js.json...OK
Writing out...OK
Writing build/app.js...OK
File "build/app.js" created.

Done, without errors.

为了验证我的逻辑,我通过如下更改src属性转储了已处理的源列表:

"src": "<%= grunt.file.write('out',grunt.template.process(grunt.file.read('./config/js.json'),{data: {js_dir: './src/js'}}))%>"

out文件的内容表明模板处理逻辑是有效的:

[
   ".src/js/a.js",
   ".src/js/b.js"
]

由于该src属性接受源文件的硬编码 JSON 数组,我的猜测是源列表的绑定是在模板完成之前完成的。

gruntjs 详细输出显示了config/js.json连接之前和之后的阅读,这让我感到困惑。

我尝试重写config/js.json文件,以便所有 JSON 数组都放在一行中,但无济于事。

如果可以做到,请告诉我怎么做。如果无法完成,请告诉我原因。

我的环境:

  • 咕噜声:咕噜声-cli v0.1.9,咕噜声v0.4.1
  • nodejs:v0.11.6-pre
  • 操作系统:Linux localhost 3.2.0-23-generic #36-Ubuntu x86_64 GNU/Linux
4

1 回答 1

4

Grunt 配置将在读取配置时处理模板。所以你不需要额外的grunt.template.process. 假设config/js.json是有效的 JSON,只需这样做:

module.exports = function(grunt) {

grunt.initConfig({
    js_dir: 'src/js',
    concat: {
        options: {separator: ";"},
        build: {
            src: require('./config/js.json'),
            dest: "build/app.js"
        }
    }
});

grunt.loadNpmTasks('grunt-contrib-concat');

grunt.registerTask('default', ['concat']);
};

永远记住 Gruntfiles 是 JavaScript 而不是 JSON。

于 2013-08-21T17:17:31.497 回答