T4 を編集すると、別のファイルに切り替えるたびにスクリプトが実行されます。簡単なスクリプトであれば問題ありませんが、実行に時間がかかるスクリプトもあります。この動作を無効にする方法はありますか? T4 ファイルを保存するか、メニューから [カスタム ツールの実行] を手動で選択した場合にのみスクリプトを実行します。
6 に答える
まったく同じ問題がありました。テンプレートを別のプロジェクトに分割し、出力ファイルを共有する方法については、この記事http://msdn.microsoft.com/en-us/library/ee789839.aspxの手順に従いました。
テンプレートを右クリックして CustomTool プロパティをクリアすることにより、テンプレートにアタッチされている TextTemplatingFileGenerator ツールをオフにする方法が詳しく説明されています。これにより、保存時にテンプレート生成コードが停止します...しかし、タブを切り替えるとまだ実行されます!
これを回避する唯一の方法は、すべてのテンプレート コードを別のサフィックス (ttinclude や t4 など) を持つ新しいファイルに移動し、include ディレクティブを使用して実際の T4 テンプレート ファイルにこのファイルを含めることだと思います。そうすれば、テンプレートを編集するためにそのファイルを開く必要がなくなるため、誤って実行されることはありません。
したがって、MyTemplate.tt という 1 つのファイルでは次のようになります。
<#@ template language="VB" debug="false" hostspecific="true"#>
<#@ include file="Include\MyTemplateCodeBehind.t4" #>
<#@ output extension=".vb"#>
<# ' Nothing to see here! #>
MyTemplateCodeBehind.t4 という名前の別のファイルでは、次のようになります。
<#@ template language="VB" debug="false" hostspecific="true"#>
<#
For Each something In somecollection
#>
<#= something.PrintMyCode() #>
<#
Next
#>
T4 は、C#/VB プロジェクト システムのカスタム ツール メカニズム ( IVsSingleFileGenerator ) に接続されています。これにより、保存時に実行し、カスタム ツール メニューを実行し、タブ切り替え時に実行する動作も提供されます。これらはすべて、単純なインターフェイスを実装する代償です。
残念ながら、これは T4 も、カスタム ツールの標準であるこれらの動作を本質的に制御できないことを意味します。
別の方法として、VS Modeling and Visualization SDK の T4 MsBuild サポートを使用してビルド時に T4 を実行し、カスタム ツールを無効にすることもできます。msbuild サポートを構築した同僚に、カスタム ツールを使用して一連のテンプレートを特定するかどうかを問い合わせ、スレッドに投稿します。
私がやっていること(おそらく悪い方法)は、ttファイルの先頭に次のような例外行を書いています:
<# throw new Exception(); #>
例外をスローするため、プロセスが停止し、すべての作業が終了したら、この行を削除するだけです。:)
コンパイル ディレクティブの直後に試して、exit メソッドに return を追加します
<#@ template language="C#" debug="false" hostspecific="true"#>
<#@ include file="EF6.Utility.CS.ttinclude"#><#@
output extension="Repository.cs"#><#
return string.Empty; //<-- add this line!!!
...
T4 テンプレートは、ファイルが保存されるときに実行されます。動作を説明する可能性のあるファイルからタブを離したときに自動保存するVSセットアップがある場合。VS 構成を確認して、タブを離したときに VS がファイルを保存しているかどうかを判断します。