2012-10-30 62 views
2

我正在尋找一種方法來快速並經常地將我的簽名和日期添加到Visual Studio中新代碼文件的頂部。插入T4生成的代碼,就好像它是一個片段

有一些關於使用宏來做到這一點的教程,但顯然VS2012中不再支持宏。

我可以將標題定義爲代碼段並插入代碼段,但片段不支持獲取當前日期。

我可以產生以下T4模板正確的文本:

<#@ template debug="false" hostspecific="false" language="C#" #> 

// <author>Pieter Müller</author> 
// <date><#=DateTime.Now.ToString("yyyy-MM-dd")#></date> 

<#@ output extension=".cs" #> 

這給了我下面的結果,這是完美的:

// <author>Pieter Müller</author> 
// <date>2012-10-30</date> 

問題是,有沒有我可以快速和經常地將這些代碼插入新的代碼文件,無論是自動還是手動使用類似於Insert Snippet或快捷鍵的東西?

如果您還沒有答案,但是您確實需要生成我需要的簽名標題,請發表評論。謝謝!

+0

而不是使用代碼片段/ T4做這件事我會看看構建之前調用的MSBuild任務/目標,並相應地自動更新文件。不應該很難做到,不需要手動工作。 – Pawel

+0

我不知道這是否有幫助,但它看起來可能有一定的潛力。這是我在這裏想到的預處理文本模板:http://stackoverflow.com/questions/9149263/t4-output-to-string – U1199880

+0

謝謝@Pawel。構建任務肯定會成爲可能,缺點是如果您不想將標題應用於所有文件,則必須小心。也許一個解決方案是在每個代碼文件的頂部插入一個標籤,爲其注入頭文件,然後設置MSBuild運行一個預編譯腳本,在標籤的任何位置注入頭文件。 –

回答

3

我討厭被回答我自己的問題,但我想出了一種T4模板作爲片段的方法,雖然它的Hack Level超過9000.它通過編寫一個T4模板生成片段,然後它自動複製到Visual Studio片段文件夾。

  • 添加Text Template項目到您的項目。

  • 設置它來構建一個片段,然後構建您想要插入的代碼。對於我的問題的例子,你想用T4模板來生成代碼段XML看起來是這樣的:

    <?xml version="1.0" encoding="utf-8"?> 
    <CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"> 
        <CodeSnippet Format="1.0.0"> 
        <Header> 
         <SnippetTypes> 
         <SnippetType>Expansion</SnippetType> 
         </SnippetTypes> 
         <Title>DateHeaderSnippet</Title> 
         <Author>user</Author> 
        </Header> 
        <Snippet> 
         <Code Language="csharp"> 
         <![CDATA[// <author>Pieter Muller</author> 
    // <date>{Today's Date}</date>]]> 
         </Code> 
        </Snippet> 
        </CodeSnippet> 
    </CodeSnippets> 
    
    • 要生成一個T4模板上面的XML,我們可以插入XML幾乎一字不差,有兩個變化。首先,這條線:

      <?xml version="1.0" encoding="utf-8"?> 
      

      必須是手動的WriteLine語句中,或<?xml標籤會混淆T4模板處理器:

      <# WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); #> 
      
    • 其次,我們想用T4處理注入今天的日期到段XML,所以我們改變:

       <![CDATA[// <author>Pieter Muller</author> 
      // <date>{Today's Date}</date>]]> 
      

      到:

       <![CDATA[// <author>Pieter Muller2</author> 
      // <date><#=DateTime.Now.ToString("yyyy-MM-dd")#></date>]]> 
      
  • 我們還添加了一些非常哈克代碼到T4模板結束時,讀碼的手動輸出文件,並將其寫入到一個片段文件。這個黑客部分是我們必須指定絕對路徑。完整的T4代碼如下所示:

    <#@ template debug="false" hostspecific="false" language="C#" #> 
    <#@ output extension=".txt" #> 
    <# WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); #> 
    <CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"> 
        <CodeSnippet Format="1.0.0"> 
        <Header> 
         <SnippetTypes> 
         <SnippetType>Expansion</SnippetType> 
         </SnippetTypes> 
         <Title>DateHeaderSnippet</Title> 
         <Author>user</Author> 
        </Header> 
        <Snippet> 
         <Code Language="csharp"> 
         <![CDATA[// <author>Pieter Muller2</author> 
    // <date><#=DateTime.Now.ToString("yyyy-MM-dd")#></date>]]> 
         </Code> 
        </Snippet> 
        </CodeSnippet> 
    </CodeSnippets> 
    <#  
        System.IO.StreamReader sr = new System.IO.StreamReader(@"C:\Users\Pieter\Documents\Visual Studio 2010\Projects\tmp\tmp\TextTemplateToWriteHeaderTemplate.txt"); 
        string sourceText = sr.ReadToEnd(); 
        sr.Close(); 
    
        System.IO.StreamWriter sw = new System.IO.StreamWriter(@"C:\Users\Pieter\Documents\Visual Studio 2010\Code Snippets\Visual C#\My Code Snippets\tryout.snippet");  
        sw.WriteLine(sourceText);  
        sw.Close();  
    #> 
    
  • 你必須編譯T4模板兩次 - 第一次運行時生成的代碼段,以及第二次運行之前運行的輸出寫入片斷文件夾。爲此,請右鍵單擊解決方案資源管理器中的模板,然後單擊Run Custom Tool

  • 現在,您可以右鍵點擊代碼中的任意位置,選擇Insert Snippet...,然後從My Code Snippets組中選擇生成的代碼段。其結果是:

    // <author>Pieter Muller2</author> 
    // <date>2012-11-09</date> 
    

我知道這是方式太麻煩要經過只是插入一個簡單的作者和日期頭,但希望別人可以使用這種技術的東西更加宏偉。你可以用這種方式來生成任何類型的動態代碼片段。

+0

我認爲T4從來沒有用於這種解決方案,無論如何+1 –

+0

T4模板生成片段..現在這是有創意的。唯一的問題是,您必須每天重新運行模板以使您的代碼段保持最新狀態。你有沒有找到解決辦法? – Dan

+0

嗯..爲什麼你必須指定絕對路徑?你正在運行真正的C#,爲什麼不用'Environment.GetFolderPath'作爲你的文檔文件夾? – Maslow

2

希望你正在使用ReSharper,它有強大的模板。我已經使用了模板變量 enter image description here

現在非常簡單的配置來實現你的例子,如果我輸入「HD」,然後按Tab這個宏,我會得到一個結果: enter image description here enter image description here

+0

謝謝@Ilya,看起來不錯,但不幸的是我沒有ReSharper。 –

相關問題