我是Grunt的新手,我在递归模板方面遇到了一些问题。这里有一个具体的,小例子:Grunt:递归模板如何工作?
var path = require('path');
module.exports = function(grunt) {
grunt.initConfig({
// Stash path here so we can reference it from templates.
path: path,
argPrint: function(arg1, arg2) { return "arg1: " + arg1 + " arg2: " + arg2; },
build: {
root_dir: __dirname,
build_dir: '<%= path.resolve(build.root_dir, "dev") %>',
vendor_dir: '<%= path.resolve(build.build_dir, "vendor") %>',
classes_dir: '<%= path.resolve(build.vendor_dir, "classes") %>',
test: '<%= argPrint(build.build_dir, "vendor") %>'
}
});
grunt.registerTask('print_build_dir', 'Prints the build directory.', function() {
grunt.log.writeln(grunt.config("build.root_dir"));
grunt.log.writeln(grunt.config("build.build_dir"));
grunt.log.writeln(grunt.config("build.vendor_dir"));
grunt.log.writeln(grunt.config("build.classes_dir"));
grunt.log.writeln(grunt.config("build.test"));
});
};
波普说成Gruntfile.js
,运行npm install grunt
,然后运行grunt print_build_dir
。
如果你在/Users/jvilk/Code/grunt-test
,我会期望,输出将是:
$ grunt print_build_dir
/Users/jvilk/Code/grunt-test
/Users/jvilk/Code/grunt-test/dev
/Users/jvilk/Code/grunt-test/dev/vendor
/Users/jvilk/Code/grunt-test/dev/vendor/classes
arg1: /Users/jvilk/Code/grunt-test/dev arg2: vendor
相反,输出是:
$ grunt print_build_dir
/Users/jvilk/Code/grunt-test
/Users/jvilk/Code/grunt-test/dev
/Users/jvilk/Code/grunt-test//Users/jvilk/Code/grunt-test/dev/vendor
/Users/jvilk/Code/grunt-test//Users/jvilk/Code/grunt-test//Users/jvilk/Code/grunt-test/dev/vendor/classes
arg1: /Users/jvilk/Code/grunt-test/dev arg2: vendor
这是怎么回事?从test
配置属性,显然path.resolve
应该收到vendor_dir
属性的正确参数 - 即它将解析为path.resolve("/Users/jvilk/Code/grunt-test/dev", "vendor")
- 但我完全困惑于为什么它预先将build.root_dir
的值与一个额外的正斜杠财产。
任何帮助或指导将不胜感激我和我的努力Gruntfile
。谢谢!
编辑:作为一个先发制人的附录,我意识到我不需要使用模板来实现这个特殊的例子 - 我可以直接使用path.resolve
。但是,在我的非示例Gruntfile
中,path.resolve
中的一个目录名称是动态设置的属性,需要使用模板。
EDIT2:由于安德鲁指出,模板工程扩建对vendor_dir
以下列方式:
'<%= path.resolve(build.build_dir, "vendor") %>' ->
path.resolve('<%= path.resolve(build.root_dir, "dev") %>', "vendor") ->
'/Users/jvilk/Code/grunt-test/<%= path.resolve(build.root_dir, "dev") %>/vendor' ->
'/Users/jvilk/Code/grunt-test//Users/jvilk/Code/grunt-test/vendor'
我test
性质的工作,因为它扩大了,像这样:
'<%= argPrint(build.build_dir, "vendor") %>' ->
argPrint('<%= path.resolve(build.root_dir, "dev") %>', "vendor") ->
'arg1: <%= path.resolve(build.root_dir, "dev") %> arg2: vendor' ->
'arg1: /Users/jvilk/Code/grunt-test arg2: vendor'
我不理解他们为什么做出这个设计决定,但是我可以通过将所有这些包含在一个重复处理字符串的函数中,直到所有<%=
都消失为止,轻松地模拟我想要的模板语义。
就是这样。我向argPrint添加了arg1的调试打印,并注意到它正在使用原始模板进行调用。我的模板思维模式不正确;我认为它立即替换了所有的配置变量,但是它会在一个层次上处理模板,并将其转发,然后递归处理所有其他模板直至完成。 –