1

こんにちは、
sharpdevelop (アクティブ レコード アプローチ) で亜音速を動作させようとしています。
T4 テンプレートからコードを生成する際に問題が発生しています。

このエラーがスローされます: Blocks are not allowed after helpers - SQLiteTest.tt

行を削除すると <#@ include file="SQLite.ttinclude" #>、エラーは発生しなくなりますが、もちろん機能しません。

エラーはSQLite.ttincludeまたはSettings.ttincludeのどこかにある はずです。ttinclude ファイルを調べましたが、ブロックまたはヘルパーが何かわかりません。

エラーの原因について何か考えはありますか? どうやらモノラル開発 T4 ジェネレーターは同じエラーをスローしますが、Visual Studio のエラーはスローしません。

4

3 に答える 3

3

Visual Studio T4 はさまざまなセグメントをステートメント、式、ボイラープレート、およびクラス機能 IIRC として参照するため、ヘルパー/ブロックでそれらが何を意味するかを言うのは少し難しいです。

ただし、Mono T4 のソース コードを確認しているときに、Block は Statements を参照し、Helpers は ClassFeatures を参照していると推測します。

T4 の例:

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

ステートメントが T4 の ClassFeatures の下に表示されないのは事実ですが、ここで私が考えているのは、Visual Studio T4 が ttinclude ファイルの「スマートな」マージを行うということです。Mono T4 がそうでない可能性があります。

その理由を理解するには、これら 2 つの 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" #>

include の直接的な実装は、ファイルをマージするだけです:

<# // 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 #>

したがって、Mono T4 には単純なアプローチを使用してファイルが含まれていると推測できますが、SubSonic テンプレートは Visual Studio T4 用に設計されており、もう少し洗練されたインクルード戦略を使用しています。

これがあなたがする必要がある理由なら

  1. ClassFeatures のみを使用するように SQLLite.ttinclude または Settings.ttinclude をリファクタリングします。.ttinclude ファイルにステートメントを含めると非常に便利なため、これはおそらく主要なリファクタリングです。
  2. Mono T4 をリファクタリングして Visual Studio T4 と同様の処理を行う

どちらも私が恐れている良いニュースではありません。

PS。Monoコードを読んでいる間、開発者はこれを考慮したようです:

//TODO: are blocks permitted after helpers?  
throw new ParserException ("Blocks are not permitted after helpers", seg.StartLocation);   
于 2011-08-21T19:00:00.617 に答える
1

この問題は、SharpDevelop4.2で修正されるはずです。他のT4ファイルを含めることによって追加されたクラス機能ブロックがサポートされるようになりました。SharpDevelopは、T4テンプレートホストからのVisualStudioオブジェクトモデルの独自の実装も公開するようになりました。Subsonicテンプレートは、VisualStudioオブジェクトモデルを使用してデータベース接続文字列を決定します。

Subsonicテンプレートを機能させるには、Settings.includeファイルに2つの変更を加える必要があります。

Visual Studioオブジェクトモデルアセンブリ(EnvDTE)への参照を置き換えます。

<#@ assembly name="EnvDTE" #>

と:

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

EnvDTEの名前空間エイリアスを使用してインポートディレクティブを追加します。

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

これらの変更を保存してから、ActiveRecord.ttファイルを保存してデータベースアクセスコードを生成します。

于 2011-10-03T20:54:40.253 に答える
1

私もこの問題に遭遇しましたが、解決策は簡単でした。

  1. <#@ include file="SQLServer.ttinclude" #> 宣言を各 .tt ファイルの末尾に移動します。幸いなことに、各 ttinclude ファイルには classFeatures のみが含まれています

  2. 次に、EvnDTE (mono には存在しない) に依存するいくつかの関数をリファクタリングする必要があります。ただし、これらの関数はプロジェクト パスのみを返すため、これは簡単に実行できます。これらの関数は、GetProjectPath、GetConfigPath、および GetDataDirectory です。ファイルの先頭で宣言されている Const を返すようにこれらを書き直しました。自動検出ほど洗練されていませんが、管理が簡単です。

これら 2 つのことを行った後、Subsonic T4 テンプレートを正常に実行できました。

于 2011-09-18T18:50:05.703 に答える