之前的标题:“为什么Grunt的concat任务不使用动态配置值?”
我正在尝试动态配置Grunt连接的文件,在此过程中我遇到了一个问题,即grunt-contrib-concat插件似乎没有获取动态设置的值。一开始我以为我做错了什么,但在创建了自己的任务并使用相同的动态值之后,一切都如愿以偿。因此,剩下的问题是,为什么咕哝的任务没有进行拾取和使用相同的值?
下面是一个再现这种行为的gruntfile (gist: fatso83 83/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'])
}编辑:一个新的线索:,经过了几个小时的无路可走,我偶然发现了在Grunt的主页上这句话
非空,如果设置为真,则操作将包括非匹配模式。结合grunt的-详细标志,此选项可以帮助调试文件路径问题。
将它添加到配置中(为了反映这一点,在上面进行了编辑),我得到了一条错误消息,它至少显示了一些具有动态值的操作:
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任务?
发布于 2014-06-26 22:33:15
在阅读https://github.com/gruntjs/grunt/blob/master/lib/grunt/file.js#L49之后更新
当我发现问题在于数组被解释为字符串之后,我很快就找到了一个相关问题与看似有希望的解决方案。只需将带花括号的内插数组字符串封装起来,Grunt就能够找到这些文件!
不幸的是,我们实际上创建的球状模式没有保留指定的文件顺序。在上面的相关问题中,我贴出一份详尽的解释是怎么回事,以及在一般情况下如何解决这个问题。
对于我的具体情况,当我引用配置对象中的字段时,实际上不需要函数调用来撤回它,因为它在模板本身的作用域中是直接可用的!因此,我不需要调用grunt.config.get('myfiles'),而只需执行<%= myfiles %>。
关于上面的例子:
grunt.initConfig({
concat : {
foo : {
nonull : true,
src: '<%= myfiles %>',
dest : 'outfile.txt'
}
},
myTask : {
bar : '<%= myfiles %>'
}
});https://stackoverflow.com/questions/24440863
复制相似问题