2012-08-30 27 views
36

में सभी स्रोत कोड फ़ाइलों में कॉपीराइट नोटिस/बैनर डालने के बाद कुछ गूगलिंग के बाद मुझे यह पता चला: Use a Visual Studio Macro to Insert Copyright Headers into Source Files। यह आशाजनक देखा:विजुअल स्टूडियो 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> 

मैंने कोशिश की जब Tools -> Macros मेनू विकल्प यह वहाँ वी.एस. 2012 में अब और नहीं था यहाँ सबूत है: Macros in Visual Studio 11 Developer Preview। उन्होंने अभी इस कार्यक्षमता को छोड़ दिया। :(

तो, मैं जानना चाहता हूं कि विजुअल स्टूडियो 2012 का उपयोग करके मेरे समाधान में सभी मौजूदा स्रोत कोड फ़ाइलों में कॉपीराइट जानकारी जोड़ने के लिए मैं किस विकल्प का उपयोग कर सकता हूं। क्या ऐसा करने का कोई मानक तरीका है टेम्पलेट फ़ाइल (T4 templates से संबंधित कुछ) या PowerShell स्क्रिप्ट? मैं .cs एक्सटेंशन वाली फ़ाइलों पर फिर से कोड करने के लिए कुछ कोड लिख सकता हूं और कॉपीराइट जानकारी जोड़ सकता हूं लेकिन यह वह नहीं है जो मैं बाद में हूं। मैं कुछ टूल के बारे में जानना चाहता हूं इस प्रक्रिया को स्वचालित करने।

+1

आप एक पूर्व/पोस्ट का निर्माण कदम है कि एक powershell स्क्रिप्ट यदि प्रत्येक सीएस फ़ाइल किसी दिए गए शीर्ष-लेख है की जाँच करता है कि चलाता है का इस्तेमाल कर सकता है, और यह पहले जोड़ें अगर यह नहीं है – PhonicUK

+1

@PonicUK: यह एक अच्छा विकल्प होगा। मैं बस PowerShell के साथ छिपा नहीं हूँ। :) –

+0

या एक छोटा सी # ऐप लिखें जो इसके बजाए ऐसा करता है और उसे चलाता है? – PhonicUK

उत्तर

33

आप नोटिस जहाँ आप चाहते हैं (कहने के लिए आप कीवर्ड जो कुछ भी करने के लिए आप चाहते हैं बदल सकते हैं अनावश्यक) सम्मिलित करने के लिए एक नया टुकड़ा और बस प्रकार सीपी + डबल टैब बना सकते हैं।

इसके साथ एकमात्र समस्या है, जो मुझे पता है, स्निपेट समय कार्यों का समर्थन नहीं करते हैं, इसलिए इस तकनीक के साथ आपकी तिथि रेखा के लिए वर्तमान समय प्राप्त करना असंभव लगता है। इसके लिए इतना अच्छा कामकाज नहीं है कि समय फ़ील्ड संपादन योग्य हो (जैसे कि एमबॉक्स स्निपेट कैसे काम करता है) और बस मैन्युअल रूप से समय डालें।

यहां एक उदाहरण है कि स्निपेट कैसा दिखता है। बोले स्निपेट को कक्षा का नाम स्वचालित रूप से प्राप्त होगा और उस स्थान पर कॉपीराइट नोटिस डालें जहां आप 'कॉपीराइट' और डबल टैब टाइप करते हैं।

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

वास्तव में दिलचस्प दृष्टिकोण! मुझे लगता है कि एकमात्र कमी यह है कि यह एक मैन्युअल प्रक्रिया है। मुझे प्रत्येक '.cs'file को खोलना होगा मुझे कॉपीराइट नोटिस जोड़ना होगा। बैच में ऐसा करने का कोई तरीका? –

+2

अफसोस की बात है कि मुझे नहीं पता कि .cs फ़ाइलों को खोलने के बिना संशोधित करने का कोई तरीका है (हालांकि यह आपके लिए ऐसा प्रोग्राम बनाने में बेहद आसान लग रहा है)। यदि आप एक तेज़ समाधान की तलाश में थे, तो मुझे दिलचस्पी होगी यदि आप एक को ढूंढने में कामयाब रहे। खुद को बनाने के लिए, दृष्टिकोण आसान दिखता है। उन फ़ाइलों को जोड़ें जिन्हें आप एक सरणी में चाहते हैं, उनमें से प्रत्येक के माध्यम से पुनरावृत्त करें और फिर उन टिप्पणी पंक्तियों को सम्मिलित करें जहां आप उन्हें चाहते हैं। – coolmine

+1

यदि आप "अपना स्वयं का समाधान" मार्ग लेने और अपने टेम्पलेट्स को संपादित करने के लिए कुछ दिशानिर्देश लेने का निर्णय लेते हैं तो कुछ कोड के साथ पोस्ट अपडेट करें। प्रयास के लिए – coolmine

19

मैं यहाँ एक 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

+4

जबकि मैं कूलमाइन के प्रयास की सराहना करता हूं, आपका जवाब वह भी है जो किसी भी गूगलर की तलाश में होगा। शायद आगे बढ़ें और अपना जवाब स्वीकार करें। :) –

+2

यह अच्छा होगा अगर फ़ंक्शन थोड़ा 'स्मार्ट' था और किसी भी मौजूदा शीर्षलेख को प्रतिस्थापित कर दिया गया ताकि आप इसे कई बार स्पैमिंग हेडर के बिना चला सकें –

2

कुछ अस्पष्ट PowerShell स्क्रिप्ट (नहीं एक एक जवाब के रूप में जोड़ा) के लिए काम हारने के बाद, मैंने तय कर लिया copyright.py बनाने के लिए। उदाहरण उपयोग:

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

यह निर्दिष्ट निर्देशिका में सभी * .cs फ़ाइलों को दोबारा पाता है और उन्हें कॉपीराइट टेक्स्ट के साथ उपसर्ग करता है। इससे कोई फ़र्क नहीं पड़ता कि फ़ाइल की शुरुआत में अन्य टेक्स्ट पहले से मौजूद है; इसे हटा दिया जाएगा।

नोट:एहतियात के तौर पर आपको चाहिए @ leniel-macaferi (कोई फ़ाइल नाम और कंपनी, बस हैडर) द्वारा इस स्क्रिप्ट

0

कोड का एक सरल संस्करण को क्रियान्वित करने से पहले अपने कोड हमेशा बैकअप:

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

, चलाने निर्देशिका आप रिकर्सिवली के माध्यम से पुनरावृति और PowerShell खिड़की से .\AddHeader.ps1 . पर अमल करना चाहते हैं में एक नई फ़ाइल (जैसे AddHeader.ps1) में कोड को बचाने के लिए।

5

मामले में यह अभी भी दिलचस्प हो सकता है, वहाँ License header plugin कि निर्माण पर किसी भी फ़ाइल का completey अनुकूलन हेडर जोड़ सकते हैं। वर्तमान में, यह वी.एस. साथ (अभी तक?) VS2013 के साथ काम करता है, लेकिन नहीं 2015

+1

वे पहले ही वीएस 2015 – Ramakrishna

+0

का समर्थन करना शुरू कर चुके हैं क्या फ़ाइल में उत्पन्न फ़ाइल नाम भी संभव है लाइसेंस हेडर? – zuckerthoben

+1

हां, '% फ़ाइल नाम%' के माध्यम से। विकी पर उनके गिटहब पेज (https://github.com/rubicon-oss/LicenseHeaderManager) पर एक नज़र डालें, बुलेट पॉइंट "एक्सपेंडेबल प्रॉपर्टीज" में सभी संभावित प्रतिस्थापन सूचीबद्ध हैं। – Thaoden

संबंधित मुद्दे