【问题标题】:Inserting copyright notice/banner in all source code files in Visual Studio 2012在 Visual Studio 2012 的所有源代码文件中插入版权声明/横幅
【发布时间】:2012-08-30 14:38:12
【问题描述】:

经过一番谷歌搜索后,我发现了这个: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 -&gt; Macros 菜单选项时,它在 VS 2012 中不再存在。这是证据:Macros in Visual Studio 11 Developer Preview。他们只是放弃了这个功能。 :(

所以,我很想知道我可以使用哪个选项来使用 Visual Studio 2012 将版权信息添加到我的解决方案中的所有现有源代码文件中。是否有任何标准方法可以使用模板文件(与T4 templates) 或PowerShell 脚​​本相关的内容?我可以编写一些代码来迭代带有.cs 扩展名的文件并添加版权信息,但这不是我想要的。我想知道一些自动化这个过程的工具。

【问题讨论】:

  • 您能否使用运行 powershell 脚本的预/后构建步骤来检查每个 CS 文件是否具有给定的标头,如果没有,则将其添加到前面?
  • @PhonicUK:这将是一个不错的选择。我只是不太熟悉 PowerShell。 :)
  • 或者编写一个小型 C# 应用程序来代替并运行它?
  • @PhonicUK:正如我所说...我可以这样做,但我正在使用一些现有的工具/扩展/任何东西来自动化整个过程。
  • 如果您愿意花一些钱,可以选择GhostDoc 的专业版。记录您的代码的插件(可惜免费版本不支持您的方案)

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


【解决方案1】:

您可以创建一个新的 sn-p 并键入 cp + double tab 以将通知插入到您想要的位置(不用说您可以将关键字更改为您想要的任何内容)。

据我所知,唯一的问题是,sn-ps 不支持时间函数,因此使用这种技术似乎不可能获得日期线的当前时间。一个不太好的解决方法是使时间字段可编辑(类似于 mbox sn-p 的工作方式)并手动插入时间。

这是一个关于 sn-p 外观的示例。下面的 sn-p 会自动获取类名,并在你输入“copyright”和双标签的地方插入版权声明。

方法一

 <?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>

方法二

另外,这里有一个程序示例,您可以为您执行此操作。

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$
    {
    }
}

【讨论】:

  • 真正有趣的方法!我看到的唯一缺点是这是一个手动过程。我必须打开每个 .csfile 我必须添加版权声明。有什么方法可以批量执行此操作?
  • 遗憾的是,我不知道是否有一种方法可以在不打开 .cs 文件的情况下修改它们(尽管制作一个为您执行此操作的程序看起来非常容易)。如果您设法找到一个,我会很感兴趣,因为我自己也在寻找更快的解决方案。至于自己制作,这种方法看起来很容易。在数组中添加你想要的文件,遍历每个文件,然后在你想要的地方插入注释行。
  • 用一些代码更新了帖子,以防您决定采用“制作自己的解决方案”路线以及一些编辑模板的指南。
  • +1 表示努力。我会接受你的回答,因为你表现出很多注意力和完成任务的不同方式。看看我的回答。我认为 PowerShell 脚本很好地捕捉了我的想法。当您开始一个新项目时,您在答案中显示的第三种方法非常好。
  • Powershell 看起来确实很有趣。请问为什么你更喜欢 Powershell 而不是制作自己的程序?虽然我认为在不打开 IDE 的情况下修改代码的能力就是其中之一。
【解决方案2】:

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

【讨论】:

  • 虽然我很欣赏coolmine 的努力,但您的答案是任何谷歌用户都在寻找的答案。也许继续接受你自己的答案。 :)
  • 如果该功能更“智能”并替换任何现有的标头,这样您就可以多次运行它而不会发送垃圾邮件标头
【解决方案3】:

如果这仍然很有趣,License header plugin 可以在创建时向任何文件添加完全可自定义的标题。目前,这确实适用于 VS2013,但不适用于 VS 2015。

【讨论】:

  • 是否也可以在license header中生成文件名?
  • 是的,通过%FileName%。在他们的 GitHub 页面 (github.com/rubicon-oss/LicenseHeaderManager) 上查看 wiki,项目符号“Expendable Properties”列出了所有可能的替代品。
  • 也支持 VS 2017。
  • 也适用于 VS2015
【解决方案4】:

根据 the release notes the release notes(向下滚动一点),Visual Studio 16.6 允许在 .editorconfig 中定义可用于创建文件横幅的 file_header_template 规则。

【讨论】:

  • 不幸的是,发行说明似乎没有显示如何使用该选项,他们只是提到它存在。你能详细说明一下吗?这听起来像是一个很有前途的解决方案,但不幸的是我在搜索中找不到任何关于它的信息
  • @rom99 我自己没有尝试过 - 但我更新了上面的链接,也许这可以帮助你进一步。
【解决方案5】:

使用以下行将 .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】:

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

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

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

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

    【讨论】:

      【解决方案7】:

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

      【讨论】:

        猜你喜欢
        • 2014-01-03
        • 1970-01-01
        • 1970-01-01
        • 2017-05-03
        • 2013-02-17
        • 1970-01-01
        • 2023-03-14
        • 2013-04-21
        • 1970-01-01
        相关资源
        最近更新 更多