上一个标题:“为什么Grunt的concat任务不使用动态配置值?”
我正在尝试动态配置由Grunt连接的文件,并且这样做我遇到了这个问题,其中grunt-contrib-concat
插件似乎没有获取动态设置的值。起初我以为我做错了什么,但在创建自己的任务并使用相同的动态值之后,一切都按照预期出现了。因此,这就留下了为什么grunt concat任务没有进行拾取和使用相同值的问题?
重现行为的grunt文件如下所示(gist:fatso83 / 73875acd1fa3662ef360)。
// Grunt file that shows how dynamic config (and option!) values
// are not used in the grunt-contrib-concat task. Run using 'grunt'
module.exports = function(grunt){
grunt.initConfig({
concat : {
foo : {
nonull : true,
src: '<%= grunt.config.get("myfiles") %>',
dest : 'outfile.txt'
}
},
myTask : {
bar : '<%= grunt.config.get("myfiles") %>'
}
});
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.registerMultiTask('myTask', function() {
grunt.log.writeln('myTask:' + this.target + ' data=' + this.data);
});
grunt.registerTask('default', ['myTask','concat']);
grunt.config.set('myfiles',['file1.txt', 'file2.txt'])
}
编辑:新的主角: 经过几个小时无处可去,我遇到了这句话on Grunt's homepage:
nonull 如果设置为true,则操作将包含不匹配 图案。结合grunt的--verbose标志,这个选项可以提供帮助 调试文件路径问题。
将其添加到配置(上面编辑以反映这一点)我收到此错误消息,至少表明某些事情正在对动态值做些什么:
Running "concat:foo" (concat) task
>> Source file "file1.txt,file2.txt" not found.
Warning: Unable to write "outfile.txt/file1.txt,file2.txt" file
(Error code: ENOTDIR). Use --force to continue.
在其他任务myTask
中进行了一些调试之后,我发现作为this.data
发送到任务的数据是字符串值,而不是数组。考虑到我们进行字符串插值,这可能不是很令人惊讶,但这与其他插值功能不一致。例如,<%= otherTask.fooTarget.src %>
将另一个任务的src
属性作为数组值。
现在问题是如何避免将插值作为数组而不是字符串传递给concat任务?
答案 0 :(得分:0)
在我发现问题是我们的数组被解释为字符串后,我很快找到了related question with a solution that seemed promising。只需用大括号括起插值数组字符串,Grunt就能找到文件了!
不幸的是,我们有效创建的the globbing pattern不会保留指定的文件顺序。在上面的相关问题中我posted a thorough explanation了解了发生了什么,以及如何在一般情况下解决这个问题。
对于我的特定情况,我在配置对象中引用一个字段,实际上不需要函数调用来检索它,因为它可以直接在模板自己的范围内使用!因此,我可以简单地执行grunt.config.get('myfiles')
。
<%= myfiles %>
对于上面的示例:
grunt.initConfig({
concat : {
foo : {
nonull : true,
src: '<%= myfiles %>',
dest : 'outfile.txt'
}
},
myTask : {
bar : '<%= myfiles %>'
}
});