web-dev-qa-db-ja.com

Visual Studio 2012のすべてのソースコードファイルに著作権表示/バナーを挿入する

いくつかのグーグルの後、これを見つけました: 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スクリプト? .cs拡張子を持つファイルを反復処理し、著作権情報を追加するコードを書くこともできますが、それは私が望んでいることではありません。このプロセスを自動化するためのツールについて知りたいのですが。

43

新しいスニペットを作成し、cp +ダブルタブを入力して、必要な場所に通知を挿入することができます(キーワードを任意に変更できることは言うまでもありません)。

唯一の問題は、私が知っている限りでは、スニペットは時間関数をサポートしていないため、この手法では日付行の現在時刻を取得することは不可能のようです。これに対するあまり良い回避策は、時間フィールドを編集可能にし(mboxスニペットの動作と同様)、時間を手動で挿入することです。

スニペットがどのように見えるかの例を次に示します。以下のスニペットは、クラス名を自動的に取得し、「copyright」とダブルタブを入力した場所に著作権表示を挿入します。

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

もちろん、いくつかのエラーをキャッチする必要があります。しかし、これにより、UIを構築し、処理するファイルを追加する方法の一般的なアイデアが得られるはずです。

方法

通常は以下にあるクラスのテンプレートを変更することもできます。

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

この投稿で見つけた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]
}

私は自分のニーズに合わせて少し修正してそれについて書きました:

PowerShellを使用してすべてのソースコードファイルに著作権表示/バナー/ヘッダーを挿入

21

これがまだ面白いかもしれない場合、 License header plugin があります。これは、作成時に任意のファイルに完全にカスタマイズ可能なヘッダーを追加できます。現在、これはVS2013では機能しますが、VS 2015では機能しません(まだ?)。

7
Thaoden

あいまいなPowerShellスクリプト(答えとして追加されたものではない)で作業を失った後、 copyright.py を作成することにしました。使用例:

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

指定されたディレクトリ内のすべての* .csファイルを再帰的に検索し、著作権テキストをプレフィックスとして付けます。ファイルの先頭に他のテキストが既に存在するかどうかは関係ありません。削除されます。

注:予防措置として、このスクリプトを実行する前に必ずコードをバックアップする必要があります

2
Pakman

@ 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ウィンドウから。

0
Nikita G.