2012-08-30 26 views
36

一些谷歌搜索後,我發現這一點:Use a Visual Studio Macro to Insert Copyright Headers into Source Files。它看起來前途無量:插入版權聲明/旗幟在Visual Studio 2012

// <copyright file="Sample.cs" company="My Company Name"> 
// Copyright (c) 2012 All Rights Reserved 
// </copyright> 
// <author>Leniel Macaferi</author> 
// <date>08/30/2012 11:39:58 AM </date> 
// <summary>Class representing a Sample entity</summary> 

當我試圖Tools -> Macros菜單選項是不存在了在2012年VS這裏的證明:Macros in Visual Studio 11 Developer Preview。他們只是放棄了這個功能。 :(

所以,我只是好奇,想知道我可以使用該選項使用Visual Studio 2012的版權信息添加到我的解決方案現有的所有源代碼文件中是否有這樣做的任何標準的方法,使用模板文件(東西與T4 templates)或PowerShell腳本?我可以寫一些代碼的文件迭代與.cs擴展,並添加版權信息,但不是我後,我想了解一些工具自動執行此過程。

+1

您可以使用運行powershell腳本的前/後構建步驟來檢查每個CS文件是否有給定的頭文件,它不? – PhonicUK

+1

@ PhonicUK:這將是一個不錯的選擇。我只是不熟悉PowerShell。 :) –

+0

或者寫一個小的C#應用​​程序來做到這一點,並運行它? – PhonicUK

回答

33

您可以創建一個新片段,只是類型CP +雙標籤插入您想要的通知(不用說,你可以切換到任何你想要的關鍵字)。

它唯一的問題是,從我所知道的片段不支持時間函數,因此使用這種技術獲取日期行的當前時間似乎是不可能的。一個不太好的解決方法是使時間字段可編輯(類似於mbox代碼段的工作方式),並且只需手動插入時間。

這裏有一個片斷的外觀的例子。下圖片段將自動獲得類名稱,並在您輸入'copyright'和雙標籤的地方插入版權聲明。

方法1

<?xml version="1.0" encoding="utf-8" ?> 
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"> 
    <CodeSnippet Format="1.0.0"> 
    <Header> 
     <Title>Copyright</Title> 
     <Shortcut>Copyright</Shortcut> 
     <Description>Code snippet for Copyright notice</Description> 
     <Author>author name</Author> 
     <SnippetTypes> 
     <SnippetType>Expansion</SnippetType> 
     </SnippetTypes> 
    </Header> 
    <Snippet> 
     <Declarations> 
     <Literal Editable="false"> 
      <ID>classname</ID> 
      <Function>ClassName()</Function> 
     </Literal> 
     </Declarations> 
     <Code Language="csharp"> 
     <![CDATA[// <copyright file="$classname$" company="My Company Name"> 
     // Copyright (c) 2012 All Rights Reserved 
     // <author>Leniel Macaferi</author> 
     // </copyright> 
     ]]> 
     </Code> 
    </Snippet> 
    </CodeSnippet> 
</CodeSnippets> 

方法2

而且,這裏有一個程序,你可以對爲你做的一個例子。

List<string> files = new List<string>() 
{ 
    "c:\\Form1.cs", 
    "c:\\Form2.cs", 
}; 

foreach (string file in files) 
{ 
    string tempFile = Path.GetFullPath(file) + ".tmp"; 

    using (StreamReader reader = new StreamReader(file)) 
    { 
     using (StreamWriter writer = new StreamWriter(tempFile)) 
     { 
      writer.WriteLine(@"// <copyright file=" + Path.GetFileNameWithoutExtension(file) + @" company=My Company Name> 
// Copyright (c) 2012 All Rights Reserved 
// </copyright> 
// <author>Leniel Macaferi</author> 
// <date> " + DateTime.Now + @"</date> 
// <summary>Class representing a Sample entity</summary> 
"); 

      string line = string.Empty; 
      while ((line = reader.ReadLine()) != null) 
      { 
       writer.WriteLine(line); 
      } 
     } 
    } 
    File.Delete(file); 
    File.Move(tempFile, file); 
} 

當然需要一些錯誤捕獲。但是,這應該給你一個大概的想法,如何在它周圍構建一個UI並添加你想要處理的文件。

方法3

它也可以改變你的類模板通常可下找到:

C:\Program Files (x86)\Microsoft Visual Studio <version>\Common7\IDE\ItemTemplates\CSharp\1033\ 

有時編輯ItemTemplatesCache也有必要顯示結果。

下面是根據你的問題的示例模板:

using System; 
using System.Collections.Generic; 
$if$ ($targetframeworkversion$ >= 3.5)using System.Linq; 
$endif$using System.Text; 

/* <copyright file=$safeitemrootname$ company="My Company Name"> 
    Copyright (c) 2012 All Rights Reserved 
    </copyright> 
    <author>Leniel Macaferi</author> 
    <date>$time$</date> 
    <summary>Class representing a Sample entity</summary>*/ 

namespace $rootnamespace$ 
{ 
    class $safeitemrootname$ 
    { 
    } 
} 
+0

真是有趣的做法!我看到的唯一缺點是這是一個手動過程。我必須打開每個'.cs'文件,我必須添加版權聲明。任何方式在批處理中執行此操作? –

+2

不幸的是,我不知道是否有一種方法可以在不打開它們的情況下修改.cs文件(儘管看起來非常容易讓一個程序爲你做)。自從我自己尋找更快的解決方案以來,如果您設法找到一個,我會很感興趣。至於自己做一個,這個方法看起來很簡單。在數組中添加你想要的文件,迭代每個文件,然後在你想要的地方插入註釋行。 – coolmine

+1

如果您決定採取「製作您自己的解決方案」路線以及編輯模板的一些指導方針,請使用一些代碼更新該文章。 – coolmine

19

我要在這裏添加PowerShell腳本我在這篇文章中發現:Powershell – Copyright header generator script。它在發佈問題之前捕捉了我的想法......

param($target = "C:\MyProject", $companyname = "My Company") 

$header = "//----------------------------------------------------------------------- 

// <copyright file=""{0}"" company=""{1}""> 

// Copyright (c) {1}. All rights reserved. 

// </copyright> 

//-----------------------------------------------------------------------`r`n" 

function Write-Header ($file) 
{ 
    $content = Get-Content $file 

    $filename = Split-Path -Leaf $file 

    $fileheader = $header -f $filename,$companyname 

    Set-Content $file $fileheader 

    Add-Content $file $content 
} 

Get-ChildItem $target -Recurse | ? { $_.Extension -like ".cs" } | % ` 
{ 
    Write-Header $_.PSPath.Split(":", 3)[2] 
} 

我寫它稍作修改,以使其適應我的需求:

Inserting copyright notice/banner/header in all source code files with PowerShell

+4

雖然我很欣賞coolmine的努力,但您的回答是任何Google員工都會尋找的。也許繼續並接受你自己的答案。 :) –

+2

這將是很好,如果功能有點'更聰明'和取代任何現有的標題,所以你可以多次運行它沒有垃圾郵件頭 –

2

失去工作,一些不起眼的PowerShell腳本(而不是一個添加爲一個答案)後,我決定創建copyright.py。示例用法:

C:\>python copyright.py "C:\users\me\documents\path\to\vsproject" 

它遞歸地查找指定目錄中的所有* .cs文件,並在它們前面加上版權文本。其他文本是否已經存在於文件的開頭並不重要;它將被刪除。

注:作爲預防措施,你應該@ leniel-macaferi(沒有文件名和公司,只是頭)執行這個腳本

0

代碼的簡化版本之前,請務必備份您的代碼:

param($target = "C:\MyProject") 

$header = "//----------------------------------------------------------------------------- 
// Copyright (c) The Corporation. All rights reserved. 
//----------------------------------------------------------------------------- 
" 

function Write-Header ($file) 
{ 
    $content = Get-Content $file 
    $filename = Split-Path -Leaf $file 
    $fileheader = $header 
    Set-Content $file $fileheader 
    Add-Content $file $content 
} 

Get-ChildItem $target -Recurse | ? { $_.Extension -like ".cs" } | % ` 
{ 
    Write-Header $_.PSPath.Split(":", 3)[2] 
} 

要運行,將代碼保存在你想遞歸遍歷和PowerShell窗口中執行.\AddHeader.ps1 .目錄的新文件(如AddHeader.ps1)。

5

如果這可能仍然很有趣,有License header plugin可以添加一個完整的自定義標題創建任何文件。目前,這可以與VS2013一起使用,但是與VS2013一起使用,但是沒有(VS)。

+1

他們已經開始支持VS 2015 – Ramakrishna

+0

是否有可能有文件名生成許可證頭? – zuckerthoben

+1

是的,通過'%FileName%'。看看他們的GitHub Page(https://github.com/rubicon-oss/LicenseHeaderManager)上的wiki,項目符號「Expendable Properties」列出了所有可能的替換。 – Thaoden