1

我在我的 Gruntfile 中使用以下内容:

grunt.initConfig({
    assets: grunt.option('assets'),
    config: grunt.file.readJSON(path.join('<%= assets %>', 'config.json')) || grunt.file.readJSON('./defaults.json'),
    ...
})

当我执行它时,它会抛出:

>> Error: Unable to read "<%= assets %>/config.json" file (Error code: ENOENT).
    >> at Object.util.error (/.../prj/node_modules/grunt-legacy-util/index.js:54:39)
    >> at Object.file.read (/.../prj/node_modules/grunt/lib/grunt/file.js:247:22)
    >> at Object.file.readJSON (/.../prj/node_modules/grunt/lib/grunt/file.js:253:18)
    >> at Object.module.exports (/.../prj/Gruntfile.js:10:28)
    >> at loadTask (/.../prj/node_modules/grunt/lib/grunt/task.js:325:10)
    >> at Task.task.init (/.../prj/node_modules/grunt/lib/grunt/task.js:437:5)
    >> at Object.grunt.tasks (/.../prj/node_modules/grunt/lib/grunt.js:120:8)
    >> at Object.module.exports [as cli] (/.../prj/node_modules/grunt/lib/grunt/cli.js:38:9)
    >> at Object.<anonymous> (/usr/local/lib/node_modules/grunt-cli/bin/grunt:45:20)
    >> at Module._compile (module.js:425:26)

想知道这是否是因为在assets我尝试使用它时没有定义 var?还是不允许以这种方式使用 <%= %> 语法?

根据这个答案,它看起来应该可以工作 - 我发现这是因为以前我只是在使用var assets = grunt.option('assets'),但由于某种原因被抛出SyntaxError: Unexpected token var。(在我弄乱它之前,它看起来像这样:)

module.exports = function(grunt) {
    require('load-grunt-tasks')(grunt)

    var util = require('util'),
        path = require('path'),
        pkg = require('./package.json')

    var assets = grunt.option('assets'),
    var config = grunt.file.readJSON(path.join(assets, 'config.json')) || grunt.file.readJSON('./defaults.json')

    grunt.initConfig({
        ...
    })

像这样使用模块或在 gruntfile 中声明变量的正确的 grunt 方式是什么?和/或,我可以解决问题Unexpected token var吗?

注意:这不是我无法加载的配置文件,而是资产路径grunt.option()似乎没有被解释的事实)

4

3 回答 3

1

似乎您想读取自定义 json 文件。请记住,即使是 grunt 脚本也只是 JavaScript,并且 node 需要正常工作。所以你可以做类似的事情

 var conf = grunt.file.exists(assets + '/ '+ 'config.json') ? require(assets + '/ '+ 'config.json') : {};

然后,您可以在任何地方使用您的config变量。

conf.foo || 'default'
conf.bar

无论哪种情况,您都需要assets在使用前声明变量。在需要或在initConfig

更新

此外,在要么删除它或删除下一行
后,你有一个额外的逗号var assets = grunt.option('assets'),var

于 2016-08-08T21:11:34.547 回答
0

您不能在花括号var assets = ..内声明,因为那不是有效的 JS 语法。grunt.init( {为了让它理解<%= %>语法,您需要做的是像这样声明它:

grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    uglify: {
        options: {
            banner: '/*! <%= pkg.name %>'
            // pkg is a property on the json object passed into initConfig
...
于 2016-08-08T21:07:00.533 回答
0

是 grunt 指定的<%= %>插值字符串,如果你在非 grunt 参数中使用它,它不会被插值(比如你在 path.join 中使用它的情况)。

要让它工作,你必须使用

grunt.template.process('<%= asset %>', {
   data: {
      assets: grunt.option('assets')
   }
})
于 2016-08-08T21:19:37.057 回答