2012-08-30 13 views
36

Dopo aver trovato su Google questo: Use a Visual Studio Macro to Insert Copyright Headers into Source Files. Sembrava promettente:Inserimento di avviso/banner di copyright in tutti i file di codice sorgente in Visual Studio 2012

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

Quando ho provato Tools -> Macros opzione di menu non era più lì in VS 2012. Ecco la prova: Macros in Visual Studio 11 Developer Preview. Hanno appena abbandonato questa funzionalità. :(

Quindi, sono solo curioso di sapere quale opzione potrei usare per aggiungere le informazioni sul copyright a tutti i file di codice sorgente esistenti nella mia soluzione usando Visual Studio 2012. C'è un modo standard per farlo, usando un file modello (qualcosa relativo a T4 templates) o uno script PowerShell? Potrei scrivere del codice per scorrere i file con l'estensione .cs e aggiungere le informazioni sul copyright ma non è quello che cerco. Mi piacerebbe sapere qualche strumento per automatizzare questo processo.

+1

Si può usare una fase di pre/post build che esegue uno script PowerShell che controlla se ogni file CS ha una determinata intestazione e lo antepone se no? – PhonicUK

+1

@PhonicUK: questa sarebbe una buona opzione. Non sono esperto di PowerShell. :) –

+0

Oppure scrivi una piccola app C# che esegue invece questa ed eseguila? – PhonicUK

risposta

33

si potrebbe creare un nuovo frammento di e proprio tipo di CP + doppia scheda per inserire l'avviso in cui si desidera (inutile dire che si può cambiare la parola chiave per quello che vuoi).

L'unico problema con esso è, da quello che so, i frammenti non supportano le funzioni temporali, quindi ottenere l'ora corrente per la data line sembra impossibile con questa tecnica. Una soluzione non molto buona per questo è rendere i campi temporali modificabili (simile a come funziona lo snippet di mbox) e inserire semplicemente l'ora manualmente.

Ecco un esempio di come appare uno snippet. Il bellow snippet otterrà automaticamente il nome della classe e inserirà l'avviso sul copyright nel posto in cui digiti "copyright" e doppia scheda.

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

Metodo 2

Inoltre, ecco un esempio di un programma che si può fare per farlo per voi.

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

Ovviamente è richiesto un errore di cattura. Ma questo dovrebbe darti l'idea generale su come costruire un'interfaccia utente attorno ad essa e aggiungere i file che vorrai elaborare.

Metodo 3

E 'anche possibile modificare il modello per le classi che possono essere essere di solito sotto:

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

A volte la modifica ItemTemplatesCache è anche necessario per visualizzare i risultati.

Ecco un modello di esempio in base alla tua domanda:

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

Approccio davvero interessante! L'unico inconveniente che vedo è che si tratta di un processo manuale. Devo aprire ogni file '.cs' che devo aggiungere l'avviso sul copyright. Qualche modo di farlo in un lotto? –

+2

Purtroppo non so se c'è un modo per modificare i file .cs senza aprirli (anche se sembra estremamente facile creare un programma che lo faccia per te). Sarò interessato se riuscirai a trovarne uno dato che stavo cercando una soluzione più veloce. Per quanto riguarda crearne uno, l'approccio sembra facile. Aggiungi i file che desideri in un array, esegui l'iterazione su ciascuno di essi e quindi inserisci le righe di commento dove desideri. – coolmine

+1

Aggiornato il post con un po 'di codice nel caso in cui si decida di prendere il percorso "creazione della propria soluzione" e anche alcune linee guida per la modifica dei modelli. – coolmine

19

ho intenzione di aggiungere qui uno script PowerShell che ho trovato in questo post: Powershell – Copyright header generator script. Cattura ciò che avevo in mente prima di postare la domanda ...

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

ho scritto su di esso con piccole modifiche per adattarlo alle mie esigenze:

Inserting copyright notice/banner/header in all source code files with PowerShell

+4

Mentre apprezzo lo sforzo di coolmine, la tua è la risposta che qualsiasi googler cercherebbe. Forse vai avanti e accetta la tua risposta. :) –

+2

Sarebbe bello se la funzione fosse un po 'più intelligente e sostituisse qualsiasi intestazione esistente in modo da poterla eseguire più volte senza intestazioni spamming –

2

Dopo aver perso il lavoro di alcuni script oscura PowerShell (non quello aggiunto come una risposta), ho deciso creare copyright.py. Esempio di utilizzo:

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

Essa trova ricorsivamente tutti i file * Cs nella directory specificata e li prefissi con il testo del copyright. Non importa se esiste già un altro testo all'inizio del file; sarà rimosso.

Nota:Come precauzione, si dovrebbe sempre un backup del codice prima di eseguire questo script

0

Una versione più semplice del codice da parte @ leniel-macaferi (senza il nome del file e la società, solo intestazione):

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

per eseguire, salvare il codice in un nuovo file (ad esempio AddHeader.ps1) nella directory che si desidera iterare ricorsivamente ed eseguire .\AddHeader.ps1 . dalla finestra di PowerShell.

5

Nel caso in cui questo potrebbe essere ancora interessante, vi è il License header plugin che può aggiungere un'intestazione completamente personalizzabile a qualsiasi file sulla creazione. Attualmente, questo funziona con VS2013, ma non (ancora?) Con VS 2015.

+1

Hanno già iniziato a supportare VS 2015 – Ramakrishna

+0

È anche possibile avere il nome file generato nel intestazione della licenza? – zuckerthoben

+1

Sì, tramite '% FileName%'. Dai un'occhiata al wiki nella loro pagina GitHub (https://github.com/rubicon-oss/LicenseHeaderManager), il punto elenco "Proprietà di spesa" elenca tutte le possibili sostituzioni. – Thaoden