Insertar aviso de copyright/banner en todos los archivos de código fuente en Visual Studio 2012


Después de buscar en Google encontré esto: Use una macro de Visual Studio para Insertar Encabezados de Copyright en los Archivos Fuente. Parecía prometedor:

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

Cuando probé la opción de menú Tools -> Macros ya no estaba allí en VS 2012. Aquí está la prueba: Macros en Visual Studio 11 Developer Preview. Acaban de dejar esta funcionalidad. :(

Por lo tanto, solo tengo curiosidad por saber qué opción podría usar para agregar la información de copyright a todos los archivos de código fuente existentes en mi solución utilizando Visual Studio 2012. ¿Hay alguna forma estándar de hacer esto, usando un archivo de plantilla (algo relacionado con T4 templates) o un script PowerShell? Podría escribir algún código para iterar sobre los archivos con la extensión .cs y agregar la información de copyright, pero eso no es lo que busco. Me gustaría saber sobre alguna herramienta para automatizar este proceso.

Author: durron597, 2012-08-30

5 answers

Puede crear un nuevo fragmento y simplemente escriba cp + double tab para insertar el aviso donde desee (no hace falta decir que puede cambiar la palabra clave a lo que desee).

El único problema es que, por lo que sé, los fragmentos no admiten funciones de tiempo, por lo que obtener la hora actual para su línea de fecha parece imposible con esta técnica. Una solución no tan buena para esto es hacer que los campos de tiempo sean editables (similar a cómo funciona el fragmento de mbox) y simplemente inserte la hora manualmente.

Aquí hay un ejemplo sobre cómo se ve un fragmento. El fragmento de código de abajo obtendrá el nombre de la clase automáticamente e insertará el aviso de copyright en el lugar donde escriba 'copyright' y double tab.

Método 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>

Método 2

También, aquí hay un ejemplo de un programa que puede hacer para hacer eso por usted.

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);
}

Por supuesto, será necesario detectar algún error. Pero esto debería darle la idea general de cómo construir una interfaz de usuario alrededor añade los archivos que quieras procesar.

Método 3

También es posible cambiar la plantilla para sus clases que generalmente se puede encontrar en:

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

A veces editar ItemTemplatesCache también es necesario para mostrar los resultados.

Aquí hay una plantilla de ejemplo basada en su pregunta:

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$
    {
    }
}
 32
Author: coolmine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-20 11:03:27

Voy a añadir aquí un script de PowerShell que encontré en este post: Powershell – Copyright header generator script. Captura lo que tenía en mente antes de publicar la pregunta...

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]
}

Escribí sobre él con pequeñas modificaciones para adaptarlo a mis necesidades:

Insertar aviso de copyright / banner / encabezado en todos los archivos de código fuente con PowerShell

 21
Author: Leniel Maccaferri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-30 20:02:00

En caso de que esto todavía pueda ser interesante, existe el complemento de encabezado de licencia que puede agregar un encabezado personalizable completo a cualquier archivo al crearlo. Actualmente, esto funciona con VS2013, pero no (¿todavía?) con VS 2015.

 6
Author: Thaoden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-17 16:44:26

Después de perder el trabajo con algún script oscuro de PowerShell (no el que se agregó como respuesta), decidí crear copyright.py . Ejemplo de uso:

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

Encuentra recursivamente todos *.archivos cs en el directorio especificado y prefijos con el texto de copyright. No importa si ya existe otro texto al inicio del archivo; se eliminará.

Nota: Como precaución, siempre debe hacer una copia de seguridad de su código antes de ejecutar este script

 2
Author: Pakman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-30 16:45:03

Una versión más simple del código por @leniel-macaferi (sin nombre de archivo y compañía, solo encabezado):

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]
}

Para ejecutar, guarde el código en un nuevo archivo (por ejemplo, AddHeader.ps1) en el directorio que desea iterar recursivamente y ejecute .\AddHeader.ps1 . desde la ventana de PowerShell.

 0
Author: Nikita G.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-21 23:35:12