プロジェクトにいくつかの T4 テンプレートがあります。tt ファイルを変更して保存するたびに、生成されたファイルが自動更新されます。これは、データベース内のすべてのテーブルをループし、約 100 以上のファイルを生成するテンプレートです。そのため、テンプレートを保存するたびに Visual Studio が数秒間ハングし、これが面倒です。「自動更新」機能を無効にする方法はありますか?コンテキスト メニューからテンプレートを手動で実行できます。
ありがとう!
プロジェクトにいくつかの T4 テンプレートがあります。tt ファイルを変更して保存するたびに、生成されたファイルが自動更新されます。これは、データベース内のすべてのテーブルをループし、約 100 以上のファイルを生成するテンプレートです。そのため、テンプレートを保存するたびに Visual Studio が数秒間ハングし、これが面倒です。「自動更新」機能を無効にする方法はありますか?コンテキスト メニューからテンプレートを手動で実行できます。
ありがとう!
編集中にファイルの [プロパティ] の [カスタム ツール] の下にある TextTemplatingFileGenerator を削除し、終了したら元に戻すことができます。
同様の問題がありました。ttinclude ファイルを作成し (実際には、これは既にテンプレートのユーティリティ関数を含む標準のインクルード ファイルでした)、すべての T4 テンプレートに含めることで、簡単な回避策を見つけました。次に、インクルード ファイルにコンパイラ エラーを作成しました。したがって、ジェネレーターを実行しようとすると、コンパイルで失敗するだけです。次に、実際に生成する準備ができたら、問題のあるコードを取り除き、生成します。
例: 失敗を引き起こすには:
<#+
#
#>
失敗を無効にするには:
<#+
//#
#>
作業中のテンプレートを無効にするだけの場合は、T4 テンプレート自体でこのトリックを使用することもできます。
うまくいけば、将来の VS バージョンでは、自動変換を単に無効にできるようになります。
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");