Javascript Grunt-解析非字符串(例如数组)模板

Javascript Grunt-解析非字符串(例如数组)模板,javascript,gruntjs,Javascript,Gruntjs,假设我在grunt配置中有一个变量,该变量的值为数组。一个真实的例子是插件中的grunt.regarde.changed,它列出了所有已更改的文件 我想使用模板解析该数组,以便(在本例中)复制更改的文件: copy: { staticWeb: { src: '<%= grunt.regarde.changed %>', dest: 'someDir' }, 复制:{ 静态网络:{ src:“”, 目的地:“someDir” }, 在本例

假设我在grunt配置中有一个变量,该变量的值为数组。一个真实的例子是插件中的
grunt.regarde.changed
,它列出了所有已更改的文件

我想使用模板解析该数组,以便(在本例中)复制更改的文件:

  copy: {
    staticWeb: {
      src: '<%= grunt.regarde.changed %>',
      dest: 'someDir'
    },
复制:{
静态网络:{
src:“”,
目的地:“someDir”
},
在本例中,
src
得到的是一个逗号分隔的字符串,而不是数组。Grunt的文件处理器不解析该字符串,因此无法找到src文件

我无法删除模板周围的单引号,因为这样它是无效的javascript

那么如何将
grunt.regarde.changed
数组传递到
src
变量?

您尝试过:

copy: {
  staticWeb: {
    src: '<%= grunt.regarde.changed.split(",") %>',
    dest: 'someDir'
  }
}
复制:{
静态网络:{
src:“”,
目的地:“someDir”
}
}

我遇到了与您完全相同的问题,请用花括号围绕模板来解决

这是你的代码,修改过了

copy: {
  staticWeb: {
    src: '{<%= grunt.regarde.changed %>}', // added curly brackets
    dest: 'someDir'
  }
}
复制:{
静态网络:{
src:'{}',//添加了花括号
目的地:“someDir”
}
}

它将
src
输出为
{source1,source2,source3}
,这与使用数组相同。(请参阅)

一旦你知道如何解决这个问题,只要几行代码,问题就很容易解决,但我花了相当长的时间从Grunt源代码中挖掘出所有相关信息,以了解该做什么,所以请耐心等待,我将带你了解背景


获取配置对象上的属性的一般方法是直截了当的:

<%= some.property %> // fetches grunt.config.get('some.property')
这将输出

$ grunt
Running "myValSetter" task

Running "debug:using_attribute" (debug) task
data.src:  c/file1.txt,a/file2.txt,b/file3.txt
type:  string

Running "debug:using_task" (debug) task
data.src:  [ 'c/file1.txt', 'a/file2.txt', 'b/file3.txt' ]
type:  Array

Running "debug:no_task_direct_setter" (debug) task
data.src:  [ 'c/file1.txt', 'a/file2.txt', 'b/file3.txt' ]
type:  Array

Done, without errors.
这个示例只是为了说明这个概念,但是您应该能够轻松地将其自定义到您的实例:)

//假设regarde是一个grunt插件(还没有使用,链接已断开)
副本:{
静态网络:{
src:“”,
目的地:“someDir”
}
}


#ezpz

太棒了!我为此挣扎了好几个小时……一个问题是,由于某种原因,它无法保持文件顺序……:-(你试过了吗?Grunt v0.4.5目前是最新的稳定版本,它对我不起作用。这太棒了。谢谢。我对实现所做的一个更改是使用
Grunt.config.set
创建单个Grunt“全局”调用
grunt.values
以包含配置中多次使用的所有非字符串值,例如
grunt.config.set('values',{a:[1,2],b:[2,3]等:[3,4]})
。此外,我不认为需要创建其他
grunt
属性,如示例中所示的
grunt.somevalue
“注册”直接使用
grunt.config.set
的非字符串值似乎就足够了。很好,有人利用了它-我记得用了一整晚的黑客攻击,包括阅读所有相关的grunt源代码来理解引擎盖下发生的事情!关于
grunt.somevalue
的事情,你是对的。我用现在答案中有一个普通变量。哦,现在我记起来了。我用它来显示直接读取设置的属性值和使用grunt.config.set之间的区别。我必须恢复编辑,否则注释毫无意义。//src://将是字符串我已清除了答案,添加了一些任务,并重命名了任务,因此更清楚的是发生了什么以及为什么会发生。在未来,我希望grunt模板将以本机方式处理非字符串值。但现在,这是我们最好的选择。这应该是公认的答案。
$ grunt
Running "myValSetter" task

Running "debug:using_attribute" (debug) task
data.src:  c/file1.txt,a/file2.txt,b/file3.txt
type:  string

Running "debug:using_task" (debug) task
data.src:  [ 'c/file1.txt', 'a/file2.txt', 'b/file3.txt' ]
type:  Array

Running "debug:no_task_direct_setter" (debug) task
data.src:  [ 'c/file1.txt', 'a/file2.txt', 'b/file3.txt' ]
type:  Array

Done, without errors.
// assuming that regarde is a grunt plugin (haven't used—link is broken)

copy: {
  staticWeb: {
    src: '<% regarde.changed %>',
    dest: 'someDir'
  }
}