私は 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
それを a 、 run npm install grunt
、そしてrun にポップします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
では、ディレクトリ名の 1 つが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'
彼らがこの設計上の決定を下した理由はわかりませんが、すべて<%=
がなくなるまで文字列を繰り返し処理する関数にこれらすべてをラップすることで、必要なテンプレート セマンティクスを簡単にエミュレートできます。