一旦你知道如何解决这个问题很容易,只需几行代码,但我花了很长时间从 Grunt 源代码中挖掘所有相关信息以了解该怎么做,所以请耐心等待当我带你穿越背景时...
获取配置对象属性的一般方法很简单:
<%= some.property %> // fetches grunt.config.get('some.property')
这适用于已在grunt.config
对象上设置的所有属性,其中(当然)包括传递给grunt.initConfig()
. 这就是为什么您可以直接引用其他任务变量的原因,例如 in <%= concat.typescriptfiles.dest %>
,因为配置对象中的所有属性都在模板自己的范围内。
从技术上讲,当 (LoDash) 模板与options
对象(如果已定义)或grunt.config
对象一起传递给模板处理器(LoDashtemplate
函数)时,就会发生这种扩展。
因此,这适用于在配置本身中设置的值,或者通过使用动态分配的值grunt.config.set()
。有关更多信息,请参阅API 文档。
不能以相同方式工作的是访问配置对象上不可用的值。似乎由于某种原因我不太确定,所有其他值总是以字符串结尾。无论您是直接访问它们还是通过方法调用,都会发生这种情况。例如,试图通过grunt.config.get()
获取一个字符串来访问配置中的一个数组。
保留文件顺序的问题的解决方法
接受的答案以某种方式起作用,但由于使用通配符语法,它将被不保留文件顺序glob()
的模块解析。这对我的构建来说是一个禁忌。
如果您要使用的数组在配置对象上不可用,一种解决方法是通过中间任务将其添加到配置中。像下面这样的东西应该可以工作:
// This variable will be used twice to demonstrate the difference
// between directly setting an attribute on the grunt object
// and using the setter method on the grunt.config object
var myFiles = ['c/file1.txt', 'a/file2.txt', 'b/file3.txt']
module.exports = function(grunt){
grunt.initConfig({
debug : {
using_attribute: {
src : '<%= grunt.value_as_attribute %>' // will be a string
},
using_task: {
src : '<%= value_by_setter %>' // will be an array
},
no_task_direct_setter: {
src : '<%= value_by_setter_early %>' // will be an array
}
}
});
grunt.registerTask('myValSetter', function() {
grunt.config.set('value_by_setter', myFiles );
});
// a task that will report information on our set values
grunt.registerMultiTask('debug', function(){
grunt.log.writeln('data.src: ', this.data.src);
grunt.log.writeln('type: ', Array.isArray(this.data.src)? "Array" : typeof this.data.src);
});
grunt.value_as_attribute = myFiles;
grunt.config.set('value_by_setter_early', myFiles );
grunt.registerTask('default',['myValSetter', 'debug']);
}
这将输出
$ 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.
这个例子只是为了说明这个概念,但你应该能够很容易地为你的实例定制它:)