web-dev-qa-db-fra.com

Insertion d'une notice/bannière de copyright dans tous les fichiers de code source dans Visual Studio 2012

Après quelques recherches sur Google, j’ai trouvé ceci: Utiliser une macro Visual Studio pour insérer des en-têtes de droits d’auteur dans des fichiers sources . Cela semblait prometteur:

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

Lorsque j'ai essayé l'option de menu Tools -> Macros, elle n'était plus présente dans VS 2012. En voici la preuve: Macros dans Visual Studio 11 Developer Preview . Ils ont juste laissé tomber cette fonctionnalité. :(

Je suis donc simplement curieux de savoir quelle option je pourrais utiliser pour ajouter les informations de copyright à tous les fichiers de code source existants de ma solution à l'aide de Visual Studio 2012. Existe-t-il un moyen standard de le faire, en utilisant un fichier modèle T4 templates) ou un script PowerShell? Je pourrais écrire du code pour parcourir les fichiers avec l'extension .cs et ajouter les informations de copyright, mais ce n'est pas ce que je recherche. J'aimerais connaître un outil pour automatiser ce processus.

39
Leniel Maccaferri

Vous pouvez créer un nouveau fragment de code et taper simplement cp + double tabulation pour insérer la notification à l'endroit souhaité (il va sans dire que vous pouvez modifier le mot clé comme vous le souhaitez).

Le seul problème que cela pose est que, de ce que je sache, les extraits ne prennent pas en charge les fonctions de temps. Il est donc impossible d’obtenir l’heure actuelle de votre date. Une solution moins efficace pour cela consiste à rendre les champs horaires modifiables (de la même manière que le fragment de mbox fonctionne) et à insérer simplement l'heure manuellement.

Voici un exemple sur l'apparence d'un extrait. L'extrait ci-dessous obtiendra automatiquement le nom de la classe et insérera la notice de copyright à l'endroit où vous tapez 'copyright' et double tab.

Méthode 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éthode 2

En outre, voici un exemple de programme que vous pouvez créer pour le faire à votre place.

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

Quelques erreurs d’erreur seront bien sûr nécessaires. Mais cela devrait vous donner une idée générale de la manière de construire une interface utilisateur autour de celle-ci et d’ajouter les fichiers que vous souhaitez traiter.

Méthode 3

Il est également possible de modifier le modèle de vos classes, qui se trouve généralement sous:

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

Parfois, éditer ItemTemplatesCache est également nécessaire pour afficher les résultats.

Voici un exemple de modèle basé sur votre question:

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

Je vais ajouter ici un script PowerShell que j'ai trouvé dans ce message: Powershell - Script de générateur d'en-tête de copyright . Cela reflète ce que j'avais en tête avant de poser la question ...

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

J'ai écrit à ce sujet avec des modifications mineures pour l'adapter à mes besoins:

Insertion d'une notice de copyright/bannière/en-tête dans tous les fichiers de code source avec PowerShell

21
Leniel Maccaferri

Dans le cas où cela pourrait toujours être intéressant, il existe le plugin License header qui peut ajouter un en-tête personnalisable complet à n’importe quel fichier lors de sa création. Actuellement, cela fonctionne avec VS2013, mais pas (encore?) Avec VS 2015.

7
Thaoden

Après avoir perdu mon travail au profit d'un obscur script PowerShell (et non de celui ajouté comme réponse), j'ai décidé de créer copyright.py . Exemple d'utilisation:

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

Il trouve de manière récursive tous les fichiers * .cs dans le répertoire spécifié et les préfixe avec le texte du copyright. Peu importe si un autre texte existe déjà au début du fichier; il sera enlevé. 

Remarque: _ ​​Par mesure de précaution, vous devez toujours sauvegarder votre code avant d'exécuter ce script

2
Pakman

Une version plus simple du code de @ leniel-macaferi (pas de nom de fichier ni de société, juste l'en-tête):

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

Pour exécuter, enregistrez le code dans un nouveau fichier (par exemple AddHeader.ps1) dans le répertoire dans lequel vous souhaitez effectuer une itération récursive et exécuter .\AddHeader.ps1 . à partir de la fenêtre PowerShell.

0
Nikita G.