12

プロジェクトにいくつかの T4 テンプレートがあります。tt ファイルを変更して保存するたびに、生成されたファイルが自動更新されます。これは、データベース内のすべてのテーブルをループし、約 100 以上のファイルを生成するテンプレートです。そのため、テンプレートを保存するたびに Visual Studio が数秒間ハングし、これが面倒です。「自動更新」機能を無効にする方法はありますか?コンテキスト メニューからテンプレートを手動で実行できます。

ありがとう!

4

3 に答える 3

12

編集中にファイルの [プロパティ] の [カスタム ツール] の下にある TextTemplatingFileGenerator を削除し、終了したら元に戻すことができます。

于 2012-11-27T23:22:38.910 に答える
1

同様の問題がありました。ttinclude ファイルを作成し (実際には、これは既にテンプレートのユーティリティ関数を含む標準のインクルード ファイルでした)、すべての T4 テンプレートに含めることで、簡単な回避策を見つけました。次に、インクルード ファイルにコンパイラ エラーを作成しました。したがって、ジェネレーターを実行しようとすると、コンパイルで失敗するだけです。次に、実際に生成する準備ができたら、問題のあるコードを取り除き、生成します。

例: 失敗を引き起こすには:

<#+

#

#>

失敗を無効にするには:

<#+

//#

#>

作業中のテンプレートを無効にするだけの場合は、T4 テンプレート自体でこのトリックを使用することもできます。

うまくいけば、将来の VS バージョンでは、自動変換を単に無効にできるようになります。

于 2014-02-04T19:50:52.513 に答える
0

TT は常に (まだ) 実行されるため、TT が実行されたときに出力を制御する別の方法を見つけました。

/********SET THIS TO REGENERATE THE FILE (OR NOT) ********/

var _RegenerateFile = true;

/********COS VS ALWAYS REGENERATES ON SAVE ***************/

// Also, T4VSHostProcess.exe may lock files. 
// Kill it from task manager if you get "cannot copy file in use by another process"

var _CurrentFolder = new FileInfo(Host.ResolvePath(Host.TemplateFile)).DirectoryName;
var _AssemblyLoadFolder = Path.Combine(_CurrentFolder, "bin\\Debug");

Directory.SetCurrentDirectory(_CurrentFolder);
Debug.WriteLine($"Using working folder {_CurrentFolder}");

if (_RegenerateFile == false)
{
    Debug.WriteLine($"Not Regenerating File");
    var existingFileName = Path.ChangeExtension(Host.TemplateFile, "cs"); 
    var fileContent = File.ReadAllText(existingFileName);
    return fileContent;
}

Debug.WriteLine($"Regenerating File"); //put the rest of your usual template

別の方法 (私が最終的に決めた方法) は、T4 にデータを提供するクラスの 1 つにプロパティを設定する条件付きコンパイル シンボルを読み取ることに基づいています。REGEN_CODE_FILESこれにより、条件付きコンパイル シンボルを追加しない限り、すべての準備 (および IDE ラグ) をスキップできるという利点があります。(これも新しいソリューション構成にすることができると思います。はい、これは機能し、以下のクラス変更の必要がなくなります

同じアセンブリで呼び出しているクラスの例..

public class MetadataProvider
{
    public bool RegenCodeFile { get; set; }

    public MetadataProvider() 
    {

#if REGEN_CODE_FILES
        RegenCodeFile = true; //try to get this to set the property
#endif
        if (RegenCodeFile == false)
        {
            return;
        }
        //code that does some degree of preparation and c...
    }
}

TTファイルでは...

var _MetaProvider = new MetadataProvider();
var _RegenerateFile = _MetaProvider.RegenCodeFile;

// T4VSHostProcess.exe may lock files. 
// Kill it from task manager if you get "cannot copy file in use by another process"

var _CurrentFolder = new FileInfo(Host.ResolvePath(Host.TemplateFile)).DirectoryName;
var _AssemblyLoadFolder = Path.Combine(_CurrentFolder, "bin\\Debug");

Directory.SetCurrentDirectory(_CurrentFolder);
Debug.WriteLine($"Using working folder {_CurrentFolder}");

if (_RegenerateFile == false)
{
    Debug.WriteLine($"Not Regenerating File");
    var existingFileName = Path.ChangeExtension(Host.TemplateFile, "cs"); 
    var fileContent = File.ReadAllText(existingFileName);
    return fileContent;
}

Debug.WriteLine($"Regenerating File");
于 2016-12-30T20:01:44.497 に答える