Вставка уведомления об авторских правах / баннера во все файлы исходного кода в Visual Studio 2012
после некоторого Googling я нашел это:используйте макрос Visual Studio для вставки заголовков авторских прав в исходные файлы. Это выглядело многообещающе:--8-->
// <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
сценарий? Я мог бы написать код для итерации по файлам с помощью
5 ответов
вы можете создать новый фрагмент и просто ввести CP + double tab, чтобы вставить уведомление, где вы хотите (излишне говорить, что вы можете изменить ключевое слово на все, что хотите).
единственная проблема с этим, из того, что я знаю, фрагменты не поддерживают функции времени, поэтому получение текущего времени для вашей строки даты кажется невозможным с помощью этой техники. Не очень хороший обходной путь для этого - сделать поля времени редактируемыми (аналогично тому, как работает фрагмент mbox) и просто вставить время вручную.
вот пример того, как выглядит фрагмент. Ниже фрагмент получит имя класса автоматически и вставить уведомление об авторских правах в том месте, где вы вводите "copyright" и double tab.
Способ 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\CSharp33\
иногда редактирование 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$
{
}
}
Я собираюсь добавить здесь сценарий PowerShell, который я нашел в этом сообщении:Powershell-сценарий генератора заголовков авторских прав. Он захватывает то, что я имел в виду, прежде чем опубликовать вопрос...
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]
}
Я написал об этом с небольшими изменениями, чтобы адаптировать его к моим потребностям:
в случае, если это еще может быть интересно, есть плагин заголовка лицензии это может добавить полностью настраиваемый заголовок в любой файл при создании. В настоящее время это работает с VS2013, но не (пока?) с VS 2015.
потеряв работу в каком-то непонятном скрипте PowerShell (не тот, который добавлен в качестве ответа), я решил создатьcopyright.py. Пример использования:
C:\>python copyright.py "C:\users\me\documents\path\to\vsproject"
Она рекурсивно находит все *.CS файлы в указанном каталоге и префиксы их с авторским текстом. Это не имеет значения, если другой текст уже существует в начале файла, он будет удален.
Примечание: в качестве меры предосторожности, вы всегда должны сделать резервную копию кода перед выполнение этого скрипта
более простая версия кода @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.