簡體   English   中英

如何禁用Visual Studio中的T4模板自動運行(2012)?

[英]how to disable T4 template auto-run in visual studio (2012)?

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

謝謝!

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

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

例如導致失敗:

<#+

#

#>

要禁用失敗:

<#+

//#

#>

如果你只想禁用你正在使用的那個,你也可以在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提供數據的類之一上設置屬性。 除非添加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");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM