2011-10-25 14 views
17

T4コード生成で小さな問題が発生しました。T4生成出力ファイルに書き込まれる#line指示文を無効にする方法

私はT4テンプレートを別々のファイルに分割し、さまざまなディレクトリに配置しました。これを行って、コード生成の一部を複数のプロジェクトで再利用することができます。モデル生成、リポジトリ生成、サービス生成には、すべてEntityGeneration.ttのコアファイルが含まれています。

残念ながら、TextTemplatingがネストされたインクルードを解決すると、生成された.csファイルに長い#lineプリプロセッサディレクティブが作成され、すべての相対パスが最低レベルのインクルードファイルに結合されます。

残念ながら、このパスは相対パスで構築されているため、実際には最大パス長(Windows 7)を超えているため、不必要に長くなります。私はこれらのディレクティブは、生成されたコードファイルに書き込まれて無効にすることができますどのように、

#line 3 "C:\VS2010\AlbatrossTravelGroup\ASC\AlbatrossTravelGroup.ASC.BusinessRules\Services\Contracts\..\..\..\..\AlbatrossTravelGroup.BusinessRules\Services\Contracts\..\..\..\AlbatrossTravelGroup.Models\Repositories\Contracts\..\..\../AlbatrossTravelGroup.Common/CodeGeneration.tt" 

私の質問はこれです:

ここでは断層の行は、あなたが興味を持っている場合には、生成されたコードからでしょうか?それに失敗した場合、ファイル構造を変更せずにこの問題を回避するにはどうすればよいですか?

+2

現在のところ、私は一時的な解決策として、 "CodeGeneration"というフォルダを作成して、このフォルダ内のT4ファイルにシンボリックリンクを作成します。次に、相対パスで他のT4ファイルを含む各T4ファイルの代わりに、ファイル名だけを使用します。次に、これらのT4テンプレートを使用したい最終的な場所で、 "CodeGeneration"ディレクトリへの相対パスを使用します。これにより、相対パスが大幅に少なくなるため、パス長が大幅に短縮されます。もし誰かが完全な説明を望むなら、私は要求があれば答えを掲示するでしょう:) – Lukazoid

+1

私の一時的な解決策は壊れました。なぜビジュアルスタジオが単にファイルの解決に失敗し始めたのか分かりません。最後に、レジストリを使用してttインクルードディレクトリを指定する必要がありますが、これは理想的ではありませんが、動作する唯一のもののようです。 – Lukazoid

+0

あなたはVSマクロソリューション[ここ](http://stackoverflow.com/questions/3506525/t4-preprocessed-template-debugging-not-working-visual-studio-2010-rtm/7505247#7505247)のようなものを試してみるかもしれません。 )。 – BitMask777

答えて

0

これが問題を解決するかどうかはわかりません。私はT4の経験が豊富です。つまり、私は自分のプロジェクトで多数のファイルを構築していますが、私はあなたが走っている問題にぶち込まれていません。

私の場合、プロジェクトの個々のファイルをレンダリングする個々の.ttファイルがあります。

次のように私はそれをやっている方法がある:私は(私は信じてstackoverflowの上のどこかから盗まれた、)SaveOutput方法があります:

void SaveOutput(string outputFileName) 
{ 
    if (!string.IsNullOrEmpty(outputFileName)) 
    { 
     string templateDirectory = Path.GetDirectoryName(Host.TemplateFile); 
     string outputFilePath = Path.Combine(templateDirectory, outputFileName); 
     string output = this.GenerationEnvironment.ToString(); 
     File.WriteAllText(outputFilePath, output); 
    } 

    this.GenerationEnvironment.Remove(0, this.GenerationEnvironment.Length); 
} 

だから私のメインの.ttファイルで、私は<#を持っています@ includes ...#>個々のファイルのさまざまな.ttファイル。例えば:もし

string filePath = GenerateInterfaceDataObject(table); 
SaveOutput(filePath); 

わからない:<#@がファイル= "DataObjectInterface.tt" #>

<#+ 
    public string GenerateInterfaceDataObject(sqlTable table) 
    { 
     string ifaceName = "I" + table.ObjectName; 
     if (table.GenerateInterfaceObjectAsBase) 
     { 
      ifaceName += "Base"; 
     } 
#> 
using System; 

namespace <#= InterfaceNamespace #> 
{ 
    public interface <#= ifaceName #> 
    { 
<#+ 
     foreach(sqlColumn col in table.Columns) 
     { 
#> 
     <#= GetColumnCSharpDataType(col) #> <#= col.FieldName #> { get; } 
<#+ 
     } 
#> 
    } 
} 
<#+ 
     return RootPath + @"\AutoGenerated\" + ifaceName + ".cs"; 
    } 
#> 

その後、私のメイン.ttクラスで、私は単純に、このような呼び出しを行うが含まれますあなたのテンプレートを壊すこの方法は、あなたのニーズに対応しますが、それは私のために働いて、私はまだそれに問題を抱えていません。

私の主な.ttファイルが実際には何も生成しないことを明確にする必要があります。それ自体がテンプレートではありません。単に各テンプレートをロードし、他のテンプレートからファイルを生成します。

関連する問題