Как вы считаете строки кода в решении Visual Studio?

Можно ли найти количество строк кода во всем решении? Я слышал о MZ-Tools, но есть ли эквивалент с открытым исходным кодом?

28 ответов

Решение

Visual Studio 2010 Ultimate имеет эту встроенную функцию.

Анализировать -> Рассчитать метрики кода

Я нашел PowerShell полезным для этого. В любом случае, я считаю, что LoC - довольно фальшивая метрика, поэтому я не верю, что нужно что-то более формальное.

Из небольшого каталога решений:

PS C:\Path> (gci -include *.cs,*.xaml -recurse | select-string .).Count
8396
PS C:\Path>

Это будет подсчитывать непустые строки во всех файлах.cs и.xaml решения. Для более крупного проекта я просто использовал другой список расширений:

PS C:\Other> (gci -include *.cs,*.cpp,*.h,*.idl,*.asmx -recurse | select-string .).Count
909402
PS C:\Other>

Зачем использовать приложение целиком, если это делает одна командная строка?:)

Я использовал Ctrl+Shift+F. Далее положить \n в поле поиска и включить поле регулярных выражений. Затем в результатах поиска в конце экрана отображается количество найденных файлов и найденные строки кода.

Счетчик строк с открытым исходным кодом для VS2005, 2003 и 2002 доступен здесь:

http://www.wndtabs.com/

Здесь также обсуждается создание надстройки с подсчетом строк, дополненной кодом на Codeproject, здесь

http://www.codeproject.com/KB/macros/LineCounterAddin.aspx

Также Slick Edit Gadgets имеют хороший счетчик строк, здесь:

http://www.slickedit.com/products/slickedit

и Microsoft Visual Studio Team System 2008 включает в себя хороший счетчик строк.

Просто помните, хотя:

Измерение прогресса в программировании с помощью строк кода похоже на измерение прогресса в самолетостроении по весу. Билл Гейтс

Вот обновление для Visual Studio 2012/2013/2015 для тех, кто хочет использовать параметр "Найти" (который я считаю самым простым): этот RegEx найдет все непустые строки с несколькими исключениями, чтобы дать наиболее точные результаты.,

Введите следующий RegEx в поле "Найти". Пожалуйста, не забудьте выбрать опцию "Использовать регулярные выражения". Измените параметр поиска на "Текущий проект" или "Полное решение" в зависимости от ваших потребностей. Теперь выберите "Найти все". В нижней части окна " Результаты поиска" вы увидите "Соответствующие строки", которые представляют собой количество строк кода.


^(?!(\s*\*))(?!(\s*\-\-\>))(?!(\s*\<\!\-\-))(?!(\s*\n))(?!(\s*\*\/))(?!(\s*\/\*))(?!(\s*\/\/\/))(?!(\s*\/\/))(?!(\s*\}))(?!(\s*\{))(?!(\s(using))).*$

Этот RegEx исключает следующие пункты:


Комментарии

// This is a comment

Многострочные комментарии (при условии, что строки правильно прокомментированы с * перед каждой строкой)

/* I am a
* multi-line
* comment */

XML для Intellisense

/// <summary>
/// I'm a class description for Intellisense
/// </summary>

HTML-комментарии:

<!-- I am a HTML Comment -->

Используя заявления:

using System;
using System.Web;

Открытие фигурных скобок:

{

Закрывающие фигурные скобки:

}

Примечание: все, что находится между фигурными скобками, будет включено в поиск, но в этом примере будет учитываться только 4 строки кода вместо 18 фактических непустых строк:

        public class Test
        {
            /// <summary>
            /// Do Stuff
            /// </summary>
            public Test()
            {
                TestMe();
            }
            public void TestMe()
            {
                //Do Stuff Here
                /* And
                 * Do
                 * Stuff
                 * Here */
            }
        }

Я создал это, чтобы дать мне гораздо более точный подсчет LOC, чем некоторые предыдущие варианты, и решил, что поделюсь. Боссы любят LOC, так что я застрял на некоторое время. Я надеюсь, что кто-то еще может найти это полезным, дайте мне знать, если у вас есть какие-либо вопросы или вам нужна помощь, чтобы заставить его работать.

Нашел этот совет: LOC с VS Найти и заменить

Не плагин, хотя, если это то, что вы ищете.

cloc - превосходная командная строка, основанная на Perl, исполняемая Windows, которая разбивает пустые строки, строки комментариев и строки исходного кода, сгруппированные по форматам файлов.

Теперь он не будет специально работать с файлом решения VS, но он может проходить по каталогам, и вы можете настроить фильтры имен файлов по своему усмотрению.

Вот пример вывода с их веб-страницы:

подскажите> cloc perl-5.10.0.tar.gz
    4076 текстовых файлов.
    3883 уникальных файла.                                          
    1521 файлов игнорируется.

http://cloc.sourceforge.net v 1,07  T=10,0 с (251,0 файлов / с, 84566,5 строк / с)
-------------------------------------------------------------------------------
Языковые файлы пустые, код комментария шкала 3-го поколения. эквив
-------------------------------------------------------------------------------
Perl               2052    110356    112521    309778 x   4,00 =     1239112,00
C                   135     18718     22862    140483 x   0,77 =      108171,91
Заголовок C/C++ 147 7650 12093 44042 x 1,00 =       44042,00
Bourne Shell        116      3402      5789     36882 x   3,81 =      140520,42
Лисп 1 684 2242 7515 х 1,25 =        9393,75
сделать 7 498 473 2044 х 2,50 =        5110,00
С ++                  10       312       277      2000 x   1,51 =        3020,00
XML                  26       231         0      1972 x   1,90 =        3746,80
yacc                  2       128        97      1549 x   1,51 =        2338,99
YAML                  2         2         0       489 x   0,90 =         440,10
DOS Batch            11        85        50       322 x   0,63 =         202,86
HTML                  1        19         2        98 x   1,90 = 186,20
-------------------------------------------------- -----------------------------
Сумма: 2510 142085 156406 547174 x 2,84 = 1556285,03
-------------------------------------------------- -----------------------------

Эквивалентная шкала третьего поколения - это грубая оценка того, сколько кода потребуется на языке третьего поколения. Не очень полезно, но все равно интересно.

Ответы здесь немного устарели, может быть, по сравнению с 2008 годом. Поскольку в более новых версиях Visual Studio 2010/2012 эта функция уже встроена. Таким образом, нет никаких оснований использовать какое-либо расширение или инструменты для него.

Возможность подсчета строк кода - Рассчитать метрики. С его помощью вы можете рассчитать свои метрики (LOC, индекс Maintaince, цикломатический индекс, глубина наследования) для каждого проекта или решения.

Просто щелкните правой кнопкой мыши на решении или проекте в Solution Explorer,

и выберите "Рассчитать метрики"

Позже данные для анализа и агрегирования могут быть импортированы в Excel. Также в Excel вы можете отфильтровать сгенерированные классы или другие шумы из ваших метрик. Эти метрики, включая строки кода LOC, могут быть собраны также в процессе сборки и включены в отчет о сборке.

Регулярные выражения изменились между VS2010 и 2012, поэтому большинство решений регулярных выражений здесь больше не работают

(^(?!(\s*//.+)))+(^(?!(#.+)))+(^(?!(\s*\{.+)))+(^(?!(\s*\}.+)))+(^(?!(\s*\r?$)))+

Найдет все строки, которые не являются пустыми, это не просто одна скобка ( '{' или '}') и не просто #include или другой препроцессор.

Используйте Ctrl-shift-f и убедитесь, что регулярные выражения включены.

Соответствующее регулярное выражение для VS 2010 и старше

^~(:Wh@//.+)~(:Wh@\{:Wh@)~(:Wh@\}:Wh@)~(:Wh@/#).+

В Visual Studio Team System 2008 вы можете сделать это из меню "Анализ" -> "Рассчитать метрики кода для решения", и оно даст вам счетчик строк всего вашего решения (среди прочего g)

Для будущих читателей я бы посоветовал расширение DPack для Visual Studio 2010.

В него встроено множество утилит, включая счетчик строк, который сообщает, сколько строк пустое, код и т. Д.

Простое решение - поиск по всем файлам. Введите "*" при использовании подстановочных знаков. Который будет соответствовать всем линиям. В конце окна результатов поиска вы увидите строку вида:

Matching lines: 563 Matching files: 17 Total files searched: 17

Конечно, это не очень хорошо для больших проектов, поскольку все строки сопоставляются и загружаются в память для отображения в окне результатов поиска.

Ссылка:

В Visual Studio 2019 в верхнем меню нужно выбрать:

'Analyze' -> 'Calculate Code Metrics' -> 'For Solution'

Это работает как в Visual Studio 2019 Professional, так и в Enterprise.

Вы можете использовать:

Я предпочитаю OxyProject Metrics VS Addin.

Другой простой инструмент для VS2008 (с открытым исходным кодом): http://www.accendo.sk/Download/SourceStat.zip

Очевидно, что инструменты проще, но я чувствую себя здорово, делая это в powershell:)

Этот скрипт находит все ссылки.csproj в файле.sln, а затем в каждом файле csproj находит файлы, включенные для компиляции. Для каждого файла, включенного в компиляцию, создается объект со свойствами: Solution, Project, File, Lines. Он сохраняет все эти объекты в списке, а затем группирует и проецирует данные по мере необходимости.

#path to the solution file e.g. "D:\Code\Test.sln"
$slnFile = "D:\Code\Test.sln"


#results
$results = @()

#iterate through .csproj references in solution file
foreach($projLines in get-item $slnFile | Get-Content | Select-String '".*csproj')
{
    $projFile = [System.IO.Path]::Combine([System.IO.Path]::GetDirectoryName($slnFile), [regex]::Match($projLines,'[^"]*csproj').Value)
    $projFolder = [System.IO.Path]::GetDirectoryName($projFile)

    #from csproj file: get lines for files to compile <Compile Include="..."/>
    $includeLines = get-item $projFile | Get-Content | Select-String '<Compile Include'


    #count of all files lines in project
    $linesInProject = 0;
    foreach($fileLine in $includeLines)
    {
        $includedFilePath = [System.IO.Path]::Combine($projFolder, [Regex]::Match($fileLine, '"(?<file>.*)"').Groups["file"].Value)
        $lineCountInFile = (Get-Content $includedFilePath).Count      
        $results+=New-Object PSObject -Property @{ Solution=$slnFile ;Project=$projFile; File=$includedFilePath; Lines=$lineCountInFile }
    }
}

#filter out any files we dont need
$results = $results | ?{!($_.File -match "Designer")}


#print out:

"---------------lines per solution--------------"
$results | group Solution | %{$_.Name + ": " + ($_.Group | Measure-Object Lines -Sum).Sum}
"---------------lines per peoject--------------"
$results | group Project | %{$_.Name + ": " + ($_.Group | Measure-Object Lines -Sum).Sum}

Вы можете использовать Visual Studio Code Metrics PowerTool 10.0. Это утилита командной строки, которая вычисляет несколько метрик для управляемого кода для вас (включая строки кода). Вы можете получить плагин VS 2010, который переносит инструмент в Visual Studio и делает его столь же быстрым, как выбор пункта меню и нажатие кнопки "Анализ решения".

Используйте Меню-> Анализировать -> Рассчитать метрики кода в Visual Studio 2010 Ultimate.

Вы можете использовать бесплатный инструмент SourceMonitor

Дает много мер: строки кода, количество операторов, сложность, глубина блока

Имеет графический вывод через графики

Согласиться с Али Парр. Надстройка WndTab Line Counter является таким инструментом. http://www.codeproject.com/KB/macros/linecount.aspx

Это также хорошая идея, чтобы искать с сайта загрузки, чтобы найти некоторый связанный инструмент. http://www.cnet.com/1770-5_1-0.html?query=code+counter&tag=srch

Вот хитрость.. Он также считает Js-файл.

http://www.spoiledtechie.com/post/2011/11/22/How-To-Count-Lines-of-Code-in-Visual-Studio.aspx

Вот сценарий, который вы можете запустить в C# Interactive, чтобы создать простой отчет о количестве строк в каждой папке, а также каждой подпапке, содержащей файлы с определенным минимальным количеством строк. Метод сбора отчетов принимает

  • АbasePath(корневая папка для анализа)
  • АfolderFilter(path,folder)для принятия решения о включении папки и ее подпапок в отчет
  • АfilePatternтакой как"*.cs"или просто"*"для всех файлов
  • АfileFilter(path,file)функция для принятия решения о подсчете строк в конкретном файле
  • АlineFilter(text)функция для принятия решения о включении определенной строки в счетчик.
      using System.IO;
using System.Collections.Generic;

// Recursively scans directories, counting lines in each one...
class LinesReport
{
    public string BasePath; // Parent path
    public string FolderName; // Folder name
    public int LocalLines; // Lines in this folder
    public int TotalLines; // Lines in this folder and subfolders
    public List<LinesReport> Subfolders = new();
    public string Error;
}

static List<LinesReport> GetLinesReports(string basePath, Func<string, string, bool>? folderFilter, string filePattern, Func<string, string, bool>? fileFilter, Predicate<string>? lineFilter)
{
    List<LinesReport> results = new();
    foreach (var dir in Directory.GetDirectories(basePath)) {
        var report = new LinesReport() { BasePath = basePath, FolderName = Path.GetFileName(dir) };
        if (folderFilter == null || folderFilter(basePath, report.FolderName)) {
            try {
                // Count lines in files in current folder
                foreach (var path in Directory.GetFiles(dir, filePattern)) {
                    var fileName = Path.GetFileName(path);
                    if (fileFilter == null || fileFilter(dir, fileName)) {
                        try {
                            report.LocalLines += CountLines(path, lineFilter);
                        }
                        catch (IOException e) {
                            report.Error = e.Message;
                        }
                    }
                }

                // Get reports for subfolders
                report.Subfolders = GetLinesReports(dir, folderFilter, filePattern, fileFilter, lineFilter);

                // Sum up total up lines
                report.TotalLines = report.LocalLines + report.Subfolders.Sum(r => r.TotalLines);

                results.Add(report);
            }
            catch (IOException e) {
                report.Error = e.Message;
            }
        }
    }
    return results;
}

static int CountLines(string path, Predicate<string>? lineFilter)
{
    int count = 0;
    foreach (string line in File.ReadAllLines(path))
        if (lineFilter == null || lineFilter(line))
            count++;
    return count;
}

static void PrintLinesReports(List<LinesReport> reports, int minLines, int indent = 0)
{
    foreach (var report in reports) {
        if (report.TotalLines >= minLines || indent == 0 || report.Error != null) {
            Console.WriteLine("{0}{1}: {2} {3}", new string(' ', indent), report.FolderName, report.TotalLines, report.Error);
            PrintLinesReports(report.Subfolders, minLines, indent + 2);
        }
    }
    if (indent == 0)
        Console.WriteLine($"Total: {reports.Count} folders in {reports[0].BasePath} with {reports.Sum(r => r.TotalLines)} lines");
}

var results = GetLinesReports(@"C:\Dev\MyProject",
    (p, dir) => !dir.StartsWith(".") && dir != "bin" && dir != "obj" && !dir.EndsWith("Test"),
    "*.cs", (p, name) => !name.EndsWith(".Designer.cs"),
    line => line.Length != 0);
PrintLinesReports(results, 100);

ВызовPrintLinesReports(results, minLines)гдеminLines— минимальное количество совпадающих строк текста, необходимое для включения папки в выходные данные. При этом печатается отчет обо всех папках и подпапках, например:

      Documentation: 0
MyProject: 5757
  RazorPages: 2335
  Controllers: 3241
    Contracts: 237
    Helpers: 1378
  Middleware: 181
Total: 2 folders in C:\Dev\MyProject with 5757 lines

Вы можете использовать надстройку счетчика строк проекта в Visual Studio 2010. Обычно она не работает с Visual Studio 2010, но она работает с полезным файлом.reg здесь: http://www.onemanmmo.com/index.php?cmd=newsitem&comment=news.1.41.0

Я придумал быстрый и грязный скрипт powershell для подсчета строк в структуре папок. Он не настолько полнофункциональный, как некоторые другие инструменты, на которые есть ссылки в других ответах, но я думаю, что он достаточно хорош для грубого сравнения размеров файлов кода относительно друг друга в проекте или решении.

Сценарий можно найти здесь:

https://gist.github.com/1674457

Попробуйте нептунер. Это также дает вам такие вещи, как пробелы, вкладки, строки комментариев в дополнение к LoC. http://neptuner.googlecode.com/files/neptuner_0_30_windows.zip

В Visual Studio 2015 перейдите в меню анализа и выберите "Вычислить метрики кода".

Вот консольное приложение vb.net, которое подсчитывает строки кода в структуре папок. В нем есть некоторые настройки для наших конкретных нужд, например некоторые расширения файлов, которые используем только мы, и в одном проекте задействованы две структуры папок. Я уверен, что это удовлетворит потребности большинства людей, и переход на C# с помощью конвертера кода будет простым.

Встроенные инструменты > расчета показателей кода для решения могут подойти некоторым людям, но они не учитывают C/C++ и не дают итоговых результатов. Приведенное ниже решение дает общий итог, общее количество по папке верхнего уровня, общее количество по расширению файла и «общее количество по расширению файла по папке верхнего уровня». Вы можете настроить оператор case, включив в него другие расширения файлов, а также настроить операторы «if» для файлов, которые хотите исключить.

ХТХ

      

Imports System.IO
Imports System.Text

Module Module1

    Private extensionsglobal As New Dictionary(Of String, Integer)

    Private output As New List(Of String)
    Private outputextensions As New List(Of String)


    Sub Main()

        Dim root As String = "c:\rootfolder"

        Dim dir As String = root & "\code"

        Dim numberoflines As Integer = DirectoryWalk(dir, 1, Nothing)

        Dim dir2 As String = root & "\someotherfolder\subfolder\sub1"

        numberoflines += DirectoryWalk(dir2, 1, Nothing)

        output.Add("Total lines of code: " & numberoflines.ToString.PadLeft(10))

        For Each key As String In extensionsglobal.Keys
            output.Add("Lines of code in files with extension " & key.PadRight(10) & " : " & extensionsglobal(key).ToString.PadLeft(10))
        Next

        Console.WriteLine(String.Join(vbCrLf, output.ToArray))
        Console.WriteLine(String.Join(vbCrLf, outputextensions.ToArray))

        Console.WriteLine("Finished")

        Console.ReadLine()

    End Sub

    Private Function DirectoryWalk(ByVal dir As String, level As Integer, extensions As Dictionary(Of String, Integer)) As Integer

        If level <= 2 Then
            Console.WriteLine("Processing: " & dir)
        End If

        Dim numberoflines As Integer = 0

        Dim d As New DirectoryInfo(dir)

        Dim extensionsthis As Dictionary(Of String, Integer)

        If level <= 2 Then
            extensionsthis = New Dictionary(Of String, Integer)
        Else
            extensionsthis = extensions
        End If

        For Each fil As FileInfo In d.GetFiles()

            Select Case fil.Extension
                Case ".vb", ".cs", ".js", ".html", ".htm", ".css", ".sql", ".php", ".asp", ".aspx", ".asmx",
                         ".c", ".cpp", ".h", ".sh", ".bat", ".cmd", ".ps1",
                         ".htaccess", ".htpasswd", ".htgroups", ".htacl", ".amsx"

                    If fil.Name Like "upgradelog*" Then Continue For
                    If fil.Name Like "*.min.css" Then Continue For
                    If fil.Name Like "*.min.js" Then Continue For
                    If fil.Name Like "*temp.js" Then Continue For
                    If fil.Name Like "select2*.js" Then Continue For
                    If fil.Name Like "selectize*.js" Then Continue For
                    If fil.Name Like "quagga*.js" Then Continue For
                    If fil.Name = "d3.js" Then Continue For
                    If fil.Name = "jq3.js" Then Continue For

                    Dim lines() As String = IO.File.ReadAllLines(fil.FullName)
                    numberoflines += lines.Count

                    If extensionsglobal.ContainsKey(fil.Extension) Then
                        extensionsglobal(fil.Extension) += lines.Count
                    Else
                        extensionsglobal.Add(fil.Extension, lines.Count)
                    End If

                    If extensionsthis.ContainsKey(fil.Extension) Then
                        extensionsthis(fil.Extension) += lines.Count
                    Else
                        extensionsthis.Add(fil.Extension, lines.Count)
                    End If

            End Select


        Next

        Dim d2 As DirectoryInfo() = d.GetDirectories()

        For Each d3 As DirectoryInfo In d2

            numberoflines += DirectoryWalk(d3.FullName, level + 1, extensionsthis)

        Next

        If level <= 2 Then
            output.Add("Lines of code in folder : " & numberoflines.ToString.PadLeft(10) & " in folder : " & dir)

            If level = 2 Then
                outputextensions.Add("Lines of code in folder : " & numberoflines.ToString.PadLeft(10) & " in folder : " & dir)

                For Each key As String In extensionsthis.Keys
                    outputextensions.Add("    code in files with extension " & key.PadRight(10) & " : " & extensionsthis(key).ToString.PadLeft(10))
                Next
            End If
        End If

        Return numberoflines

    End Function

End Module


Другие вопросы по тегам