2014-10-31 1 views
0

우리는 기본적으로 템플릿 내용에 대한 인수와 템플릿에 필요한 정보를 전달하여 코드 파일의 문자열 표현을 생성하고자하는 상황이 있습니다 자체 :Abstract (자동 컴파일 없음, 자동 파일 관리 없음)에서 T4 코드 생성

//*** PSEUDO CODE *** // 
//loaded from an embedded resource file in a .dll. no physical file on file system 
string templateContents = ...; 
//has properties used by the template 
object complexParameter = ...; 

string generatedCode = generator.MakeCode(templateContents, complexParameter); 

그러나 우리는 현재 우리가 원하는 것을하기 위해 T4 템플릿 생성을 시도하는 데 문제가 있습니다. 우리가 사용하는 실제 코드는 다음과 같습니다

var templatingEngine = new Engine(); 
//T4TextTemplateHost is our own class implementing ITextTemplatingEngineHost & IServiceProvider 
var templateHost = new T4TextTemplateHost(references, imports) 
{ 
    Properties = parameters, 
    //this is supposed to be a file path? the generation bombs if this is left null 
    TemplateFile = "Dummy Value" 
}; 
var templateContents = GetTemplateFileContents(); 
var retVal = templatingEngine.ProcessTemplate(templateContents, templateHost); 

//if a CompilerError occurs, we get NO code, just a "ErrorGeneratingOutput" message 
foreach (CompilerError error in templateHost.Errors) 
    //this information is pretty worthless: a compile error with line number for a 
    //non-existant code file 
    retVal += String.Format("{0}{2}Line: {1}{2}{2}", error.ErrorText, 
          error.Line, Environment.NewLine); 

문제는 코드 생성기 어딘가에 실제 파일을 기대하는 것, 그리고 일이 잘못 갈 때, 우리는 쓸모없는 오류 메시지를 얻을, 우리가 코드를 얻을 수 없다는 것입니다 뒤로. 특히 생성 된 코드에 오류가있는 경우에는 코드를 자동으로 컴파일하지 않는 것이 좋습니다 (문제 해결시 전체 파일이 손상되지 않도록하려는 경우).

우리는 원하는대로 무엇이든 가져갈 수있는 문자열을 출력합니다.

T4 코드 생성을 의사 코드 예제와 유사하게 만들 수있는 방법이 있습니까? T4가 CodeSmith와 같은 것을 선호하여 T4 도구를 포기할 위기에 처했습니다. T4가 매우 제한적이며 템플릿 및 처리 출력을 관리하는 매우 구체적인 방법을 고려해야하기 때문입니다.

+1

저는 CodeSmith에서 일하고 있으며 메모리 템플릿에서 지원합니다. 전체 .net 런타임에 액세스 할 수도 있습니다. 문의 사항이 있으시면 언제든지 문의하십시오. –

+1

T4 템플릿을 계속 사용하려는 경우 변환 프로세스에서 생성 된 코드 파일을 볼 수있는 내 확장 기능 (T4 Awesome)에 기능을 추가했습니다. 이것은 디버깅에 도움이되며 변환 과정을 이해하는 데 도움이됩니다. [here] (https://www.t4awesome.com)에서 다운로드 할 수 있습니다. 이 기능은 Community Edition에서 사용할 수 있으므로 무료로 사용할 수 있습니다. – Frank

+0

고마워요. 나는 CodeSmith로 끝나고 T4보다 훨씬 좋아 보인다. 메모리 요구 사항을 충족하는 것 외에도 큰 이점은 디자이너/인텔리 센스 지원이 더 우수하고 더 낫지 만 (철저히는 아니지만) 문서화 된 것입니다. 또한 질문에 대답하고 도움을 줄 수있는 반응적인 지원이 있습니다. – Colin

답변

1

전달하는 템플릿에 오류가있는 경우 T4가 생성 할 수 있다고 생각하지 않습니다. T4는 템플리트를 코드 작성자로 변환하여 문자열 작성자, 최종 작성자 그런 다음 stringwriter가 결과로 반환됩니다. 템플릿에 오류가있는 경우 코드가 적용되지 않으므로 반환 할 내용이 없습니다. 다시 오류가 전달 된 서식 파일의 줄로 해결해야합니다 적어도 내 경험이되었습니다.

코드 스미스가 다른 방식으로 작동하지만 렌더링하려는 대상의 복잡성에 따라 충분히 간단 할 경우 Nustache을 사용하여 운이 좋을지 모르겠습니다. 그것은 콧수염 템플렛의 점 그물 버전입니다. 기본 루핑 및 if/then 유형 제어 블록을 지원합니다. 전자 메일 및 보고서를위한 간단한 템플릿을 생성하기 위해 포함 된 텍스트 파일과 함께 성공적으로 사용했습니다.

+0

명확히하기 위해, 나는 템플릿 자체에 오류가 있다고 생각하지 않는다. 매개 변수에 잘못된 데이터가 있다고 생각한다. 나는 변형이 성공적으로 일어난다 고 믿지만 변형의 결과는 모든 경우에 컴파일되지 않는다. 그것이 내게 준 라인은 "using"지시어로, 혼란 스럽습니다. 어쨌든 링크 덕분입니다. 우리는 그와 같은 오픈 소스 도구를 고려하고 있지만, CodeSmith가 문서화 및 질문에 대한 ping을 할 수있는 사람의 가용성 측면에서보다 성숙하고 더 잘 보였기 때문에 CodeSmith에 기대고있었습니다. 그러나, 그 가정이 틀린 경우에 저에서 말하게 자유롭게 느끼십시오! – Colin

+2

디버깅 T4는 어떤 일을하는지 완전히 이해하지 못하는 경우가 있습니다.내가 한 가장 좋은 점은 시간이 좀 걸리고 [Reflector] (http://www.red-gate.com/products/dotnet-development/reflector/) 또는 [JustCode] (http : // www와 같은 디 컴파일러를 사용하는 것입니다. .red-gate.com/products/dotnet-development/reflector /)를 사용하여 실제로 어떻게 작동하는지 알아보십시오. 그러나 지원이 필요하고 예산이 있다면 CodeSmith와 같은 것을 시도해보십시오. 완전히 지원됩니다. 현재 VS 팀은 T4를 지원하고 있지만 팀의 주된 목표는 아니며 모든 팀이 Microsoft 내에서 전체 팀을 확보 할 지 확신하지 못합니다. – Frank

+0

고마워, 프랭크. 그것이 내가 알고 싶었던 모든 것입니다. – Colin