2011-08-21 6 views
1

안녕하세요,
나는 sharpdevelop (Active Record Approach)에서 SQLite를 사용하기 위해 아음속을 얻으려고합니다.
T4 템플릿에서 코드를 생성하는 데 문제가 있습니다.T4 템플릿 생성 오류가 sharpdevelop에서 subsonic의 activerecord를 실행하려고 시도했습니다.

그것은이 오류가 발생합니다 : 이 이 블록은 도우미 후 허용되지 않습니다 - SQLiteTest.tt

를 내가 더 이상 오류가 발생하지 않습니다 <#@ include file="SQLite.ttinclude" #> 라인 를 제거하면,하지만 물론 그렇지 않습니다 작업.

오류가 나는 ttinclude 파일을 통해 검토 한 또는 Settings.ttinclude SQLite.ttinclude 어딘가해야하지만 블록 또는 헬퍼가 무엇인지 모른다.

오류의 원인에 대한 의견이 있으십니까? 모노 개발 T4 생성기는 Visual Studio의 오류가 아닌 동일한 오류를 발생시킵니다.

답변

3

Visual Studio T4에서 Statement, Expression, BoilerPlate 및 ClassFeature IIRC와 같은 다양한 세그먼트를 참조하므로 Helper/Block과의 의미가 다소 어렵습니다.

모노 T4에 대한 source code을 확인하는 동안 Block은 Statement와 Helpers를 참조하는 것이 ClassFeatures를 참조한다고 추측합니다.

T4 예 :

<# // This is a Statement #> 
<#+ // This is a ClassFeature #> 

그것은 문이 T4에서 ClassFeatures하지만 내가 여기서 무슨 일이 일어나고 생각하고 아래에 표시 할 수없는 사실은 ttinclude 파일의 Visual Studio를 T4가하는 "스마트"병합입니다. Mono T4는 그렇지 않을 수도 있습니다.

왜 이러한 두 개의 T4 파일을 고려해야할까요?

예 T4.ttinclude :

<# // 1. This is a Statement #> 
<#+ // 1. This is a ClassFeature #> 

예 T4.tt

<# // 2. This is a Statement #> 
<#+ // 2. This is a ClassFeature #> 
<#@ include file="T4.ttinclude" #> 

직접적인 단지 파일을 병합 할 것 등의 구현 :

<# // 2. This is a Statement #> 
<#+ // 2. This is a ClassFeature #> 
<# // 1. This is a Statement #> 
<#+ // 1. This is a ClassFeature #> 

을하지만 이것은 불법이다 T4 템플릿을 사용하여 Visual Studio T4에서 (내 지식으로)이 파일을이 파일에 병합합니다. 법률 :

내가 추측을 할 수 있습니까 경우
<# // 1. This is a Statement #> 
<# // 2. This is a Statement #> 
<#+ // 1. This is a ClassFeature #> 
<#+ // 2. This is a ClassFeature #> 

그래서 모노 T4는 간단한 방법을 사용하여 파일을 포함하지만, 음속 템플릿을 약간 더 세련된 전략을 포함 사용하는 비주얼 스튜디오 T4에 대한 디자인 있다는 것입니다.

이것은 단지 ClassFeatures을 사용하려면

  1. 리팩터링 SQLLite.ttinclude에 또는 Settings.ttinclude 당신이 필요로 할 이유는 경우. 그것은 아마 a에서 주요한 리팩터링을 가지고있는 것입니다.ttinclude 파일은 매우 편리합니다.
  2. 리팩터링 모노 T4는

는 어느 쪽도 좋은 소식은 내가 두려워하지 Visual Studio를 T4와 유사한 일을 할 수 있습니다.

추신. 모노 코드를 읽는 동안은이를 생각 dev에 보인다

//TODO: are blocks permitted after helpers? 
throw new ParserException ("Blocks are not permitted after helpers", seg.StartLocation); 
+0

SharpDevelop는 MonoDevelop T4 엔진을 사용하므로 둘 다 동일한 문제가 있습니다. 문제에 대한 훌륭한 분석. MonoDevelop T4 엔진은 클래스 기능이있는 템플릿을 포함 할 때 스마트 병합을 수행하지 않습니다. –

1

나뿐만 아니라이 문제로 실행이 솔루션은 그러나 간단했다.

  1. 각 .TT 파일의 끝에 파일을 포함 = "SQLServer.ttinclude"#> 선언을 < #를 @로 이동 ,. 다행히도 각 ttinclude 파일에는 classFeatures 만 포함됩니다.

  2. 그러면 EvnDTE (모노로 존재하지 않음)에 의존하는 몇 가지 기능을 리팩토링해야합니다. 이 함수는 프로젝트 경로 만 반환하기 때문에이 작업은 간단합니다. 이러한 함수는 GetProjectPath, GetConfigPath 및 GetDataDirectory입니다. 방금 파일의 머리 부분에 선언 된 Consts를 반환하기 위해 이들을 다시 작성했습니다. 자동 감지만큼 우아하지는 않지만 관리하기에 충분합니다.

두 가지 작업을 수행 한 후 Subsonic T4 Templates를 성공적으로 실행할 수있었습니다.

1

이 문제는 이제 SharpDevelop 4.2에서 수정되었습니다. 다른 T4 파일을 포함하여 추가 된 클래스 기능 블록이 이제 지원됩니다. 또한 SharpDevelop는 T4 템플릿 호스트에서 Visual Studio 개체 모델을 자체 구현하여 제공합니다. Subsonic 템플릿은 Visual Studio 개체 모델을 사용하여 데이터베이스 연결 문자열을 결정합니다.

<#@ assembly name="EnvDTE" #> 

으로 :

는 비주얼 스튜디오 개체 모델 어셈블리에 대한 참조 (EnvDTE)를 교체 :

당신이 Settings.include 파일이 수정해야 작동하도록 음속 템플릿을 얻으려면 :

<#@ assembly name="$(addinpath:ICSharpCode.PackageManagement)PackageManagement.dll" #> 

는 EnvDTE에 대한 네임 스페이스 별칭 가져 오기 지시문을 추가합니다 :

<#@ import namespace="EnvDTE = ICSharpCode.PackageManagement.EnvDTE" #> 

이러한 변경 내용을 저장하고 ActiveRecord.tt 파일을 저장하여 데이터베이스 액세스 코드를 생성하십시오.

관련 문제