2012-11-27 88 views
9

我的項目中有一些T4模板。每當我做出更改並保存tt文件時,它都會自動更新生成的文件。這是一個循環數據庫中所有表的模板,並生成大約100多個文件。因此,每當我保存我的模板時,visual studio會掛起幾秒鐘,這很煩人。有沒有辦法禁用「自動刷新」功能,我可以通過上下文菜單手動運行模板。如何在Visual Studio(2012)中禁用T4模板自動運行?

謝謝!

+0

是的,我很驚訝, 「功能」 在Visual Studio。地獄,我很驚訝它仍然在visual studio 2013中。它使得在visual studio中開發t4模板幾乎是不可能的。 –

回答

11

在編輯文件時,您可以在文件屬性的「自定義工具」下刪除TextTemplatingFileGenerator,然後在完成後將其放回。

+0

感謝您的分享。這項工作肯定會奏效。想知道是否有更好的選擇。 – Calvin

1

我有一個類似的問題。我通過創建一個ttinclude文件(實際上這已經是一個包含我的模板的實用函數的標準包含文件)並將其包含在我所有的T4模板中,從而快速找到了解決方法。然後我只是在include文件中創建了一個編譯器錯誤。因此,當生成器試圖運行時,它只會在編譯時失敗。然後,當我準備好實際生成時,我擺脫了有問題的代碼,然後生成。

例如引起故障:

<#+ 

# 

#> 

要禁用失敗:

<#+ 

//# 

#> 

您還可以,如果你只是想禁用你的工作的一個用這一招在T4模板本身。

希望未來的VS版本將允許您簡單地禁用自動轉換。

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提供數據的類之一的屬性條件編譯符號。除非添加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");