在Visual Studio 2012中的所有源代码文件中插入版权声明/横幅

时间:2012-08-30 14:38:13

标签: c# visual-studio-2012 banner copyright-display

经过一些谷歌搜索后,我发现了这一点: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扩展名的文件并添加版权信息,但这不是我想要的。我想知道一些自动化这个过程的工具。

7 个答案:

答案 0 :(得分:34)

您可以创建一个新代码段,只需输入cp + double标签即可将通知插入您想要的位置(不用说您可以将关键字更改为您想要的任何内容)。

唯一的问题是,据我所知,片段不支持时间函数,因此使用此技术获取日期行的当前时间似乎是不可能的。一个不太好的解决方法是使时间字段可编辑(类似于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$
    {
    }
}

答案 1 :(得分:21)

我将在这里添加一篇我在这篇文章中找到的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

答案 2 :(得分:7)

如果这可能仍然有趣,那么License header plugin可以在创建时为任何文件添加一个完整的可自定义标头。目前,这适用于VS2013,但不适用于VS 2015。

答案 3 :(得分:3)

按照 the release notes the release notes(向下滚动),Visual Studio 16.6允许在file_header_template中定义一个.editorconfig规则,该规则可以用于创建文件横幅。

答案 4 :(得分:2)

在将工作丢失到一些不起眼的PowerShell脚本(不是作为答案添加的脚本)之后,我决定创建copyright.py。用法示例:

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

以递归方式查找指定目录中的所有* .cs文件,并在其前面加上版权文本。文件开头是否已存在其他文本无关紧要;它将被删除。

注意: 作为预防措施,您应该在执行此脚本之前备份代码

答案 5 :(得分:2)

使用以下行将 .editorconfig 文件添加到您的 Visual Studio 项目:

file_header_template = // <copyright file="{fileName}.cs" company="xyz Corporation">\n// Copyright (c) Xyz Corporation. All rights reserved.\n// </copyright>

接下来,将光标放在任何 C# 或 Visual Basic 文件的第一行,然后键入 (Ctrl+.) 以触发快速操作和重构菜单。选择添加文件横幅。如果要将文件头应用于现有项目或解决方案的所有文件,请选择“修复所有出现在:”选项下的“项目”或“解决方案”。

此方法适用于新文件甚至现有文件。这是内置在 Visual Studio 代码中的,因此您不需要自定义脚本。

此处的详细信息:https://docs.microsoft.com/en-us/visualstudio/releases/2019/release-notes-v16.6#net-productivity:~:text=Add%20file%20headers%20to%20existing%20files

答案 6 :(得分:0)

@ 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 .