Як ви рахуєте рядки коду у рішенні Visual Studio?


800

Чи можна знайти кількість рядків коду в цілому рішенні? Я чув про MZ-Tools , але чи існує еквівалент з відкритим кодом?


24
Я погоджуюсь, що це не дуже допомагає, але якщо керівництво про це просить ...
Фермін

33
LoC - це просто метрика і особливо цікаво в 2 випадках: 1) щоб зрозуміти, наскільки велика база коду, тобто коли ви приєднаєтесь до нової команди 2), щоб виміряти свій прогрес, намагаючись зробити свою базу коду більш компактною
Piotr Owsiak

191
Деякі люди тут кажуть, що підрахунок рядків коду марний, не задумуючись про це. Це досить корисно, оскільки це показник, який, як правило, слід мінімізувати. Це простий спосіб виміряти складність рішення (а не ефективність), і якщо проблема, як відомо, проста, тим більше рядків коду, як правило, тим нижча якість. Інша справа, чому люди турбують відповідати, якщо просто сказати, що це питання погано? Що ви думаєте, якби вчитель сказав вам ваше запитання, просто не слід його задавати.

77
У VS2010 є вбудований інструмент, який також підраховує всі рядки коду та інші значення: Перейдіть до Перегляду -> Інші Windows -> Результати показників коду. Маленька кнопка в кутку, що нагадує календар, натисніть на неї, підказка повинна сказати Обчислити показники коду для підсолення, і дозвольте VS це робити.
user959631

64
Людині не завжди потрібно розповідати, чому вони хочуть рахувати код. Коли питання про це просто сказано, справа навколо чому не має значення. Просто відповідайте на його запитання. Ненавиджу це. Бувають випадки, щоб запитати, чому, коли явно вам потрібно, і тоді трапляються моменти, коли ви цього не робите (коли ви особисто не бачите потреби ... і просто засуджуєте плакат зарозуміло).
PositiveGuy

Відповіді:


524

У Visual Studio 2010 Ultimate є вбудований:

Аналіз → Обчислення показників коду


12
Кінцева та преміальна, я думаю
Стефан Драгнев

39
Попередження: Це робить багато інших речей, крім простого підрахунку рядків. У ньому також перераховані "Індекс ремонтопридатності", "Цикломатична складність", "Глибина спадкування" та "Класова сполука", які все є досить складними для обчислення, і ви не можете запускати показники лише для частини. Це означає, що якщо ваша база кодів особливо велика, ви можете сидіти годинами, чекаючи її. Якщо все, що вам потрібно, це підрахунок рядків, є набагато швидші рішення.
Даррель Гофман

4
також на vs2012 ultimate =)
oCcSking

9
VS 2013 має Аналіз -> Обчислити показники коду
Дінеш Раджан

42
Шкода, що це не працює з власними проектами C ++ (принаймні, це не у VS2013).
Кемерон

844

Я знайшов повноваження корисними для цього. Я вважаю, що 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. Ні, це мене не турбує. Дизайнери, gen'd-код та коментарі теж мають бути збережені.)
Грег Д

27
дуже приємно, повністю забув про powerhell. вона повинна стати заміною за замовчуванням для cmd
lubos hasko

4
Відмінно! Ваш кінцевий коментар справді підсумовує це, це тривіальне завдання, тож навіщо використовувати нетривіальний інструмент? Хоча я дійсно думаю, він повинен бути включений у всі версії VS.
Sune Rievers

13
Якщо ви хочете виключити резервні файли, згенеровані для XAML, ви можете просто додати перемикач -exclude: (dir -exclude *.g.cs -include *.cs,*.xaml -recurse | select-string .).Count
EZ Hart

348

Я використовував Ctrl+ Shift+ F. Далі введіть \nу поле пошуку і ввімкніть поле регулярних виразів. Тоді в результатах пошуку в кінці екрану знаходяться кількість шуканих файлів та знайдені рядки коду.

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


16
Це рішення невірно включає порожні рядки, коментарі, документацію та розділені заяви. Для багатьох програм вони не повинні вважатися рядками коду.
Джей Бакстер

1
Хоча це трохи неточно (якщо ви фактично використовуєте \ n у своєму коді, цей рядок буде подвійно зараховано), це все одно найкраща відповідь, якщо вам потрібен ПЗУ рядків коду без стороннього інструменту
Joseph Duty

1
Ви також можете вибрати певний тип файлу, вибравши опцію, що Look at these file types:випадає, просто внизу enable regular expressions box.
Мошій

1
Працює для дуже малих проектів ... коли у вас є 100 мільйонів рядків коду, це займе певний час.
болото

10
[^\n\s]\r\nпропускає порожні рядки навіть з пробілами в них.
Zach Mierzejewski

219

Лінійний лічильник з відкритим кодом для VS2005, 2003 та 2002 років доступний тут:

http://www.wndtabs.com/

Тут також обговорюється створення рядка підрахунку рядків VS addin у комплекті з кодом на Codeproject

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

Також гаджети Slick Edit мають приємний лічильник ліній, тут:

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

і Microsoft Visual Studio Team System 2008 включає хороший лічильник ліній.

Пам'ятайте, хоча:

Вимірювання прогресу програмування за допомогою рядків коду подібно вимірюванню прогресу будівництва літака за вагою. Білл Гейтс


1
Часто підрахунок рядків коду є Just Plain Silly, а кількість не означає якість. Однак величезна команда, яка поставила в повітря 545 000 фунтів Dreamliner - це зовсім інше досягнення, ніж запуск ультраліту, який я власноруч побудував у своєму гаражі. І якщо ви думаєте про кількість рядків коду в Windows, можливо, містер Білл мав на увазі це по-іншому, ніж зазвичай прийнято ...?
БезумовноВстановітьMonica

18
Здається, жодне з них не стосується Visual Studio 2010, і порізане посилання розірвано.
MGOwen

57
Ви знайдете функцію LOC у Visual Studio 2010 Ultimate у розділі "Аналіз> Кодекс показників", я сподіваюся, що я переклав це правильно. У мене є німецька версія. Там це "Аналіз"> "Codemetriken berechnen"
OneWorld

2
для Visual Studio 2012 показник LoC можна знайти на веб-сайті ANALYZE> Розрахувати показники коду для рішення
tetri

2
Крім того, VS2012 включає цю функцію як у виданнях Ultimate, так і в преміум-класах (а тепер і 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, ніж деякі попередні варіанти, і я подумав, що поділюсь. Боси люблять кількість місць локалізації, тому я на деякий час зациклювався на цьому. Я сподіваюся, що хтось інший може знайти це корисним, дайте мені знати, якщо у вас є якісь питання або вам потрібна допомога, щоб його працювати.


18
Любіть голос без коментарів. Це не повинно бути дозволено. Що з моїм рішенням не працює ??? Мені навіть байдуже голоси, я просто хотів опублікувати оновлення для користувачів 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 # я не тестував.
користувач12861

^ ~ (: Wh @ //) ~ (: Wh @ \ {: Wh @) ~ (: Wh @ \}: Wh @) ~ (: Wh @ \ #) ~ (: Wh @ $). + Закінчилося працюючи краще для C #, я отримував деякі рядки, що складаються з простого простору.
користувач12861

Чи не враховується також і всі коментовані рядки? Просто рядки КОДУ, будь ласка!
HydPhani

4
Ось один, який я розробив з тим, що працює у VS2012 (той, що розміщений, застарів станом на 2010 рік) і рахує лише рядки коду. Він виключає всі коментарі, використовуючи директиви, фігурні фігурні дужки, директиви xml, порожні рядки тощо ..., щоб дати вам лише істинний код: ^ (?! (\ S **)) (?! (\ S * \ - \ - \>)) (?! (\ s * \ <\! \ - \ -)) (?! (\ s * \ n)) (?! (\ 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 х 1,00 = 44042,00
Борн Шелл 116 3402 5789 36882 х 3,81 = 140520,42
Lisp 1 684 2242 7515 х 1,25 = 9393,75
скласти 7 498 473 2044 х 2,50 = 5110,00
C ++ 10 312 277 2000 x 1,51 = 3020,00
XML 26 231 0 1972 х 1,90 = 3746,80
yacc 2 128 97 1549 x 1,51 = 2338,99
ЯМЛ 2 2 0 489 х 0,90 = 440,10
Пакет DOS 11 85 50 322 x 0,63 = 202,86
HTML 1 19 2 98 х 1,90 = 186,20
-------------------------------------------------- -----------------------------
Сума: 2510 142085 156406 547174 х 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, індекс утримання, цикломатичний індекс, глибина спадкування) для кожного проекту чи рішення.

Просто клацніть правою кнопкою миші рішення або проект у Провіднику рішень,

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

і виберіть "Обчислити показники"

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

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


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@/#).+

19

У Visual Studio Team System 2008 ви можете зробити це з меню Аналіз -> "Обчислити метрику коду для рішення", і це дасть вам ряд рядків всього вашого рішення (серед іншого g )


12
Visual Studio Team System 2008 не вдається рахувати некерований код. ;)
Крістіан


11

Просте рішення - пошук у всіх файлах. Наберіть "*", використовуючи символи. Який би відповідав усім рядкам. Наприкінці вікна результатів пошуку ви повинні побачити рядок сортування:

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

Звичайно, це не дуже добре для великих проектів, оскільки всі рядки кешовані та завантажуються в пам'ять, щоб виплачуватися у вікні результатів пошуку.

Довідка:




4

Очевидно, інструменти простіше, але мені здається, що це круто роблять :)

Цей скрипт знаходить усі посилання .csproj у файлі .sln, а потім у кожному файлі csproj знаходить файли, включені до компіляції. Для кожного файлу, що входить до компіляції, він створює об'єкт із властивостями: Рішення, Проект, Файл, Лінії. Він зберігає всі ці об’єкти у списку, а потім групує та проектує дані за потребою.

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


3

Використовуйте Меню-> Аналіз -> Параметр Обчислити метрику коду у Visual Studio 2010 Ultimate.


3

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




2

Ви можете використовувати безкоштовний інструмент SourceMonitor

Дає безліч заходів: рядки коду, кількість заяв, складність, глибина блоку

Має графічні виходи за допомогою діаграм



1

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

Сценарій можна знайти тут:

https://gist.github.com/1674457



0

У Visual Studio 2015 перейдіть до меню Аналіз та виберіть "Обчислити метрику коду".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.