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

800

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

Фермин
источник
24
Я согласен, что это не очень помогает, но если руководство просит об этом ...
Фермин
33
LoC - это просто показатель, который особенно интересен в 2 случаях: 1) чтобы понять, насколько велика база кода, т.е. когда вы присоединяетесь к новой команде 2) измерить свой прогресс при попытке сделать вашу базу кода более компактной
Петр Осиак
191
Некоторые люди здесь говорят, что считать строки кода бесполезно, не задумываясь об этом. Это очень полезно, так как это показатель, который, как правило, должен быть сведен к минимуму. Это простой способ измерить сложность решения (а не эффективность), и, если известно, что проблема проста, чем больше строк кода, тем ниже качество. Другое дело, почему люди не отвечают, если просто сказать, что вопрос плохой? Что бы вы подумали, если бы учитель сказал вам, что ваш вопрос просто не следует задавать.
77
В VS2010 есть встроенный инструмент, который подсчитывает все строки кода и другие значения: перейдите в View -> Other Windows -> Результаты метрик кода. Нажмите маленькую кнопку в углу, похожую на календарь, и нажмите на нее, чтобы всплывающая подсказка показала «Рассчитать метрики кода для решения», и пусть VS сделает свое дело.
user959631
64
Человек не всегда должен говорить вам, почему он хочет считать код. Когда вопрос в этом просто сформулирован, случай вокруг почему не имеет значения. Просто ответь на его вопрос. Я ненавижу это. Есть моменты, чтобы спросить, почему, когда вам явно нужно, а потом бывают случаи, когда вы этого не делаете (когда вы лично не видите в этом необходимости ... и просто надменяете плакат в высокомерии).
PositiveGuy

Ответы:

525

Visual Studio 2010 Ultimate имеет следующие встроенные функции:

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

Гертер
источник
12
Ultimate и Premium, я думаю
Стефан Драгнев
39
Предупреждение: это делает много других вещей, кроме простого подсчета строк. В нем также перечислены «Индекс ремонтопригодности», «Цикломатическая сложность», «Глубина наследования» и «Соединение классов», все они довольно сложны для вычисления, и вы не можете запустить метрики только для его части. Это означает, что если ваша кодовая база особенно велика, вы можете часами сидеть в ожидании этого. Если вам нужен только счетчик строк, есть гораздо более быстрые решения.
Даррел Хоффман
4
также на vs2012 ultimate =)
oCcSking
9
VS 2013 имеет Анализ -> Рассчитать метрики кода
Динеш Раджан
42
Жаль, что это не работает с нативными проектами C ++ (по крайней мере, в VS2013).
Кэмерон
844

Я нашел 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>

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

Грег Д
источник
19
(Единственный раз, когда меня попросили предоставить счетчик строк, когда высшее руководство выясняло, сколько времени потребуется, чтобы перенести все наши продукты за границу, чтобы они могли закрыть наш внутренний сайт.)
Грег Д.
8
(Да, это включает в себя файлы и комментарии codegen. Нет, это меня не беспокоит. Дизайнеры, ген код и комментарии также должны быть сохранены.)
Грег Д.
27
очень красиво, совсем забыл про powershell. он должен стать заменой по умолчанию для cmd
lubos hasko
4
Отлично! Ваш заключительный комментарий действительно подводит итог, это тривиальная задача, так зачем использовать нетривиальный инструмент? Хотя я действительно думаю, что это должно быть включено во все версии VS.
Sune Rievers
13
Если вы хотите исключить файлы поддержки, созданные для XAML, вы можете просто добавить ключ -exclude: (dir -exclude *.g.cs -include *.cs,*.xaml -recurse | select-string .).Count
EZ Hart
349

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

Вы можете использовать, [^\n\s]\r\nчтобы пропустить пустые и только пробелы строки (кредиты для Зак в комментариях).

NicolásKittsteiner
источник
16
Это решение неправильно содержит пустые строки, комментарии, документацию и разделенные операторы. Для многих приложений они не должны учитываться как строки кода.
Джей Бакстер
1
Хотя это немного неточно (если вы на самом деле используете \ n в своем коде, эта строка будет отсчитана дважды), это все равно будет лучшим ответом, если вам понадобится ПЗУ строк кода без стороннего инструмента
Joseph Duty
1
Вы также можете выбрать определенный тип файла, выбрав Look at these file types:раскрывающийся список опций ниже enable regular expressions box.
Моши
1
Работает для очень маленьких проектов ... когда у вас есть 100 миллионов строк кода, это займет некоторое время.
Марш
11
[^\n\s]\r\nпропускает пустые строки, даже с пробелами в них.
Зак Межеевский
219

Счетчик строк с открытым исходным кодом для 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 включает в себя хороший счетчик строк.

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

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

Али Парр
источник
1
Часто считать строки кода просто глупо, а количество не означает качество. Тем не менее, огромная команда, выпускающая 545 000 фунтов (545 000 фунтов !!) Dreamliner в воздух, является совершенно другим достижением, чем запуск ультралита, который я построил в одиночку в своем гараже. И если вы думаете о количестве строк кода в Windows, может быть, мистер Билл имел в виду это иначе, чем это обычно воспринимается ...?
Безоговорочно
18
Кажется, что ни один из них не применим к Visual Studio 2010, и ссылка slickedit не работает.
MGOwen
57
Вы найдете функцию LOC в Visual Studio 2010 Ultimate в разделе «Анализ> Метрики кода». Надеюсь, я правильно ее перевел. У меня есть немецкая версия. Там это «Анализ»> «Codemetriken berechnen»
OneWorld
2
для Visual Studio 2012 метрику LoC можно найти в разделе АНАЛИЗ> Рассчитать метрики кода для решения
тетри
2
Кроме того, VS2012 включает эту функцию в версиях Ultimate и Premium (а теперь и в Professional).
SWalters - Восстановить Монику
81

Вот обновление для 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, так что я застрял на некоторое время. Я надеюсь, что кто-то еще может найти это полезным, дайте мне знать, если у вас есть какие-либо вопросы или вам нужна помощь, чтобы заставить его работать.

Говард Ренолье
источник
18
Люблю downvote без комментариев. Это не должно быть разрешено. Что насчет моего решения не работает ??? Меня не волнуют голоса, я просто хотел опубликовать обновление для пользователей VS2012-2013.
Говард Ренолье
Трудно отфильтровать весь сгенерированный код (AssemblyInfo и т. Д.), Поэтому предпочтение следует отдавать метрикам анализа / расчета кода.
MKesper
4
Отличная работа, но, пожалуйста, отметьте флажок « Использовать регулярное выражение» в разделе « Параметры поиска ». Это делает это намного проще
Гогуц
@MKesper, НО ЭТО НЕ РАБОТАЕТ ДЛЯ C ++
d7samurai
Более простая версия, если нет ни XML, ни HTML ... ^ (? ([^ \ R \ n]) \ s) * [^ \ s +? /] + [^ \ N] * $.
LastBlow
80

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

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

Мадс Андерсен
источник
Я люблю это, но я думаю, что нашел там маленькую ошибку в выражении. Для VB.Net я думаю, что это должно быть ^ ~ (: Wh @ ') ~ (: Wh @ \ #). +, А для C # я думаю ^ ~ (: Wh @ //) ~ (: Wh @ \ {: Wh @) ~ (: Wh @ \}: Wh @) ~ (: Wh @ \ #). + Таким образом, чистые строки комментариев и директивы компилятора обрабатываются правильно. В любом случае, с VB.NET это работало лучше, а C # я не тестировал.
user12861
^ ~ (: Wh @ //) ~ (: Wh @ \ {: Wh @) ~ (: Wh @ \}: Wh @) ~ (: Wh @ \ #) ~ (: Wh @ $). + Закончилось работая лучше для C #, я получал несколько строк, состоящих только из пробелов.
user12861
Разве он не учитывает также все закомментированные строки? Просто строки кода, пожалуйста!
HydPhani
4
Вот тот, который я написал, который работает в VS2012 (опубликованный устарел по состоянию на 2010 год) и учитывает только строки кода. Он исключает все комментарии, используя директивы, фигурные скобки, директивы xml, пустые строки и т. Д ...., чтобы дать вам истинный счетчик только кода: ^ (?! (\ S **)) (?! (\ S * \) - \ -?! \>)) ((\ s * \ <\ \ - \ -?!?!)) ((\ s * \ п)) ((\ s ** \ /)) (?! (\ s * \ / *)) (?! (\ s * \ / \ / \ /)) (?! (\ s * \ / \ /)) (?! (\ s * \})) (? ! (\ s * \ {)) (?! (\ s (использующий))). * $
Говард Ренолет
65

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

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

Марк Рушаков
источник
1
Это здорово и супер просто в использовании. Гораздо проще, чем решения «Найти / Заменить», и более ясно, что он делает на самом деле, чем опция VS Code Metrics. Как раз choco install clocи тогда cloc .в вашем решении реж. Работа выполнена!
Рори
1
Я загрузил Windows EXE- файл с веб-сайта CLOC и запустил его в папке проекта моего веб-сайта Visual Studio 2017. Работал как шарм. Мне нравится опция --by-file-by-lang, в которой указывается количество строк для каждого файла и языка с сортировкой от наибольшего к наименьшему.
Хумбадс
42

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

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

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

введите описание изображения здесь

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

введите описание изображения здесь

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

Regfor
источник
2
Visual Studio 2010 также имеет эту метрику. На самом деле ничего нового в VS2012 нет.
Майк Чалий
1
Да, но ответы здесь взяты со времен 2008 года и немного устарели, зачем использовать что-либо или устанавливать какое-то расширение, если это встроенная функция. И даже это не новая функция, о которой многие люди не знают.
Regfor
@MikeChaliy Может быть, второе вступительное предложение сбило вас с толку, поэтому я немного переписал его, чтобы избежать такой путаницы.
Regfor
У меня есть n-слойное решение, но оно отображает эту ошибку: «Исключение было выброшено целью вызова». Почему?
user197508
5
Это не строки кода, а скомпилированные строки (т. Е. После преобразования в IL). Я думаю, что Фермин искал предварительно скомпилированные строки.
mikeschuld
29

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

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

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

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

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

^~(:Wh@//.+)~(:Wh@\{:Wh@)~(:Wh@\}:Wh@)~(:Wh@/#).+
user2711915
источник
19

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

Кристофер Кляйн
источник
12
Visual Studio Team System 2008 не умеет считать неуправляемый код. ;)
Кристиан
11

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

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

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

Ссылка:

Sogartar
источник
4

Очевидно, что инструменты проще, но я чувствую себя здорово, делая это в 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}
anakic
источник
3

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

Сунил
источник
3

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

Travis
источник
2

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

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

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

Ованес Акопян
источник
1

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

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

https://gist.github.com/1674457

Джесси Табер
источник
0

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

Atters
источник