我是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的調試打印,並注意到它正在使用原始模板進行調用。我的模板思維模式不正確;我認爲它立即替換了所有的配置變量,但是它會在一個層次上處理模板,並將其轉發,然後遞歸處理所有其他模板直至完成。 –