저는 Grunt에 익숙하지 않습니다. 재귀 템플릿에 몇 가지 문제가 있습니다. Gruntfile.js
로, npm install grunt
를 실행 한 다음 grunt print_build_dir
을 실행그란트 : 재귀 템플릿은 어떻게 작동합니까?
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"));
});
};
팝 : 다음은 콘크리트, 최소한의 예입니다.
당신이 /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
구성 속성에서 vendor_dir
속성에 대한 올바른 인수를 path.resolve
에 수신해야합니다. 즉, path.resolve("/Users/jvilk/Code/grunt-test/dev", "vendor")
으로 해결되지만, 왜 여분의 슬래시를 사용하여 build.root_dir
의 값을 prepending하는지 완전히 혼란 스럽습니다. 재산.
어떤 도움이나 지침도 저와 고투의 두분 모두에게 크게 감사 할 것입니다. Gruntfile
. 감사!
EDIT : 선제 적 부록으로서,이 특별한 예제를 실현하기 위해 템플릿을 사용할 필요가 없음을 알고 있습니다. path.resolve
을 직접 사용할 수 있습니다. 그러나 예를 들어 Gruntfile
이 아닌 경우 path.resolve
에있는 디렉터리 이름 중 하나는 동적으로 설정된 속성이므로 템플릿을 사용해야합니다. 그렇게하지
'<%= 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'
: 그것과 같이 확장으로
'<%= 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
속성 일, 앤드류가 지적 하듯이, 템플릿 확장은 다음과 같은 방법으로 vendor_dir
에서 작동 : EDIT2
왜 그들이이 디자인 결정을했는지 이해하지만, 나는 모든 문자열을 반복적으로 처리하는 함수에 이들을 모두 래핑하여 원하는 모든 템플릿을 에뮬레이트 할 수 있습니다. 모든 문자는 <%=
이 없어 질 때까지 반복됩니다.
이것은 그 것이다. argPrint에 arg1의 디버그 프린트를 추가하고 원시 템플릿으로 호출되고 있음을 확인했습니다. 내 템플릿 모델링의 정신 모델이 잘못되었습니다. 나는 그것이 모든 설정 변수를 즉시 대체한다고 생각했지만 템플릿 대신 하나의 레벨을 처리하고이를 검증 한 다음 모든 템플릿을 완료 될 때까지 재귀 적으로 처리합니다. –