我是 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"));
});
};
将其弹出到 aGruntfile.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:正如 Andrew 所指出的,模板扩展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'
我不明白他们为什么做出这个设计决定,但我可以很容易地模拟我想要的模板语义,方法是将所有这些包装在一个重复处理字符串直到全部<%=
消失的函数中。