Подтвердить что ты не робот

Вставка уведомления об авторских правах/баннера во всех файлах исходного кода в Visual Studio 2012

После некоторого Googling я нашел это: Использовать макрос Visual Studio для вставки заголовков авторских прав в исходные файлы. Это выглядело многообещающим:

// <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. Здесь доказательство: Макросы в Visual Studio 11 Developer Preview. Они просто отбросили эту функциональность.: (

Итак, мне просто интересно узнать, какой вариант я мог бы использовать для добавления информации об авторских правах во все существующие файлы исходного кода в моем решении с помощью Visual Studio 2012. Есть ли стандартный способ сделать это, используя файл шаблона ( что-то связано с T4 templates) или PowerShell script? Я мог бы написать код для итерации по файлам с расширением .cs и добавить информацию об авторских правах, но это не то, что мне нужно. Я хотел бы узнать о каком-то инструменте для автоматизации этого процесса.

4b9b3361

Ответ 1

Вы можете создать новый фрагмент и просто набрать cp + double tab, чтобы вставить уведомление, где вы хотите (не говоря уже о том, что вы можете изменить ключевое слово так, как хотите).

Единственная проблема с этим - из того, что я знаю, фрагменты не поддерживают функции времени, поэтому получение текущего времени для вашей строки даты кажется невозможным с помощью этой техники. Нехорошим обходным путем для этого является создание редактируемых временных полей (подобно тому, как работает фрагмент mbox) и просто вставляйте время вручную.

Вот пример того, как выглядит фрагмент. Следующий фрагмент получит имя класса автоматически и добавит уведомление об авторских правах в том месте, где вы наберете "авторское право" и двойную вкладку.

Метод 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);
}

Конечно, потребуется некоторая уловка ошибок. Но это должно дать вам общее представление о том, как создать пользовательский интерфейс вокруг него, добавить файлы, которые вы хотите обработать.

Метод 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$
    {
    }
}

Ответ 2

Я собираюсь добавить здесь PowerShell script, который я нашел в этом сообщении: Powershell - генератор заголовков заголовков 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]
}

Я написал об этом с небольшими изменениями, чтобы адаптировать его к моим потребностям:

Вставка уведомления об авторских правах/баннера/заголовка во всех файлах исходного кода с помощью PowerShell

Ответ 3

Если это может быть интересно, есть плагин заголовка лицензии, который может добавить полный настраиваемый заголовок в любой файл при создании. В настоящее время это работает с VS2013, но не (пока?) С VS 2015.

Ответ 4

Потеряв работу с каким-то непонятным PowerShell script (а не тем, который был добавлен в качестве ответа), я решил создать copyright.py. Пример использования:

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

Он рекурсивно находит все *.cs файлы в указанном каталоге и префикс их с текстом авторского права. Не имеет значения, существует ли другой текст в начале файла; он будет удален.

Примечание.. В качестве меры предосторожности вы всегда должны делать резервную копию своего кода перед выполнением этого script

Ответ 5

Простая версия кода от @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) в каталоге, который вы хотите рекурсивно перебирать и выполнять .\AddHeader.ps1 . из окна PowerShell.