[经过一番谷歌搜索后,我发现了这一点:Use a Visual Studio Macro to Insert Copyright Headers into Source Files。看起来很有希望:
// <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
菜单选项时,在VS 2012中就不存在了。这是证明:Macros in Visual Studio 11 Developer Preview。他们只是放弃了此功能。 :(
所以,我很好奇我可以使用哪个选项将版权信息添加到使用Visual Studio 2012的解决方案中的所有现有源代码文件中。是否有任何标准的方法可以使用模板文件来完成(与T4 templates
相关)还是PowerShell
脚本?我可以编写一些代码来对扩展名为.cs
的文件进行迭代并添加版权信息,但这不是我要的。我想了解一些可自动执行此过程的工具。
您可以创建一个新的代码段,只需键入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构造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$
{
}
}
我将在此处添加在本文中找到的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
如果可能仍然很有趣,可以使用License header plugin在创建时将完全可定制的标头添加到任何文件。目前,此功能在VS2013上有效,但在VS 2015上还不能使用。
在丢失一些晦涩的PowerShell脚本(而不是作为答案添加的脚本)后,我决定创建copyright.py。用法示例:
C:\>python copyright.py "C:\users\me\documents\path\to\vsproject"
它递归地找到指定目录中的所有* .cs文件,并在它们的前面加上版权文字。文件开头是否已经存在其他文本并不重要;它将被删除。
注意: 为预防起见,在执行此脚本之前,应始终备份代码
根据the release notes(向下滚动),Visual Studio 16.6允许在file_header_template
中定义一个可用于创建文件标语的.editorconfig
规则。
@ leniel-macaferi编写的代码的简单版本(没有文件名和公司,只有标头):
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]
}
要运行,请将代码保存在要递归迭代的目录中的新文件(例如AddHeader.ps1)中,并从PowerShell窗口执行.\AddHeader.ps1 .
。