Jak policzyć wiersze kodu w rozwiązaniu Visual Studio?

800

Czy można znaleźć liczbę wierszy kodu w całym rozwiązaniu? Słyszałem o MZ-Tools , ale czy istnieje odpowiednik open source?

Fermin
źródło
24
Zgadzam się, że to niewiele pomaga, ale jeśli zarząd o to poprosi ...
Fermin
33
LoC jest po prostu miarą i jest szczególnie interesujący w 2 przypadkach: 1) aby dowiedzieć się, jak duża jest baza kodu, tj. Kiedy dołączasz do nowego zespołu 2), aby zmierzyć swoje postępy, gdy próbujesz uczynić bazę kodu bardziej zwartą
Piotr Owsiak
191
Niektórzy twierdzą, że liczenie linii kodu jest bezużyteczne bez dokładnego przemyślenia. Jest to bardzo przydatne, ponieważ jest to metryka, którą należy zasadniczo zminimalizować. Jest to prosty sposób pomiaru złożoności rozwiązania (a nie wydajności), a jeśli wiadomo, że problem jest prosty, im więcej wierszy kodu, tym ogólnie niższa jakość. Inną kwestią jest to, dlaczego ludzie zawracają sobie głowę odpowiedzią, jeśli chodzi tylko o stwierdzenie, że pytanie jest złe? Co byś pomyślał, gdyby nauczyciel powiedział ci twoje pytanie, po prostu nie powinno być zadawane.
77
W VS2010 znajduje się wbudowane narzędzie, które zlicza wszystkie wiersze kodu i inne wartości: Idź do Widok -> Inne okna -> Wyniki pomiaru kodu. Kliknij mały przycisk w rogu, który wygląda jak kalendarz, kliknij w nim, w etykiecie powinno być napisane Obliczanie kodu kodu dla soulution i pozwól VS to zrobić.
user959631
64
Osoba ta nie zawsze musi mówić, dlaczego chce liczyć kod. Kiedy pytanie brzmi tak po prostu, pytanie dotyczące tego, dlaczego jest nieistotne. Odpowiedz na jego pytanie. Nienawidzę tego. Są chwile, aby zapytać, dlaczego, kiedy jest to wyraźnie konieczne, a czasem są takie, których nie potrzebujesz (kiedy osobiście nie widzisz potrzeby ... i po prostu brzydzisz plakat z arogancją).
PositiveGuy,

Odpowiedzi:

524

Program Visual Studio 2010 Ultimate ma następujące funkcje:

Analiza → Oblicz metryki kodu

Herter
źródło
12
Myślę, że Ultimate i Premium
Stefan Dragnev
39
Ostrzeżenie: Robi to wiele innych rzeczy poza liczeniem linii. Zawiera także „Indeks utrzymania”, „Złożoność cykliczną”, „Głębokość dziedziczenia” i „Sprzężenie klas”, z których wszystkie są dość skomplikowane do obliczenia i nie można uruchomić metryk dla tylko części. Oznacza to, że jeśli baza kodu jest szczególnie duża, możesz siedzieć godzinami i czekać na nią. Jeśli wszystko, czego potrzebujesz, to liczenie linii, istnieją znacznie szybsze rozwiązania.
Darrel Hoffman
4
również w vs2012 ultimate =)
oCcSking
9
VS 2013 ma Analizuj -> Oblicz metryki kodu
Dinesh Rajan
42
Szkoda, że ​​to nie działa z natywnymi projektami C ++ (przynajmniej nie w VS2013).
Cameron
844

Uważam, że PowerShell jest do tego przydatny. I tak uważam LoC za dość fałszywą miarę, więc nie uważam, że należy wymagać czegoś bardziej formalnego.

Z katalogu małego rozwiązania:

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

To policzy niepuste linie we wszystkich plikach .cs i .xaml rozwiązania. W przypadku większego projektu użyłem innej listy rozszerzeń:

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

Po co korzystać z całej aplikacji, gdy zrobi to jeden wiersz poleceń? :)

Greg D.
źródło
19
(Jedyny raz, kiedy poproszono mnie o podanie liczby linii, to kiedy kierownictwo wyższego szczebla zastanawiało się, ile czasu zajmie migracja wszystkich naszych produktów za granicę, aby mogli zamknąć naszą stronę internetową.)
Greg D
8
(Tak, dotyczy to zakodowanych plików i komentarzy. Nie, to mi nie przeszkadza. Projektanci, genodowany kod i komentarze również muszą być utrzymane.)
Greg D
27
bardzo fajnie, zupełnie zapomniałem o PowerShell. powinien stać się domyślnym zamiennikiem cmd
lubos hasko
4
Świetny! Twój końcowy komentarz tak naprawdę podsumowuje, jest to trywialne zadanie, więc po co używać nietrywialnego narzędzia? Chociaż naprawdę uważam, że powinien on być zawarty we wszystkich wersjach VS.
Sune Rievers
13
Jeśli chcesz wykluczyć pliki kopii zapasowej wygenerowane dla XAML, możesz po prostu dodać przełącznik -klucz: (dir -exclude *.g.cs -include *.cs,*.xaml -recurse | select-string .).Count
EZ Hart
348

Użyłem Ctrl+ Shift+ F. Następnie wstaw a \nw polu wyszukiwania i włącz pole wyrażeń regularnych. Następnie w wynikach wyszukiwania na końcu ekranu znajduje się liczba wyszukanych plików i znalezione wiersze kodu.

Możesz użyć [^\n\s]\r\ndo pominięcia pustych i spacji wierszy (podziękowania dla Zacha w komentarzach).

NicolásKittsteiner
źródło
16
To rozwiązanie nieprawidłowo obejmuje puste wiersze, komentarze, dokumentację i instrukcje podzielone. W wielu aplikacjach nie powinny być liczone jako wiersze kodu.
Jay Baxter
1
Chociaż jest nieco niedokładny (jeśli faktycznie użyjesz \ n w kodzie, wiersz ten zostanie podwójnie policzony), nadal jest najlepszą odpowiedzią, jeśli potrzebujesz ROMu wierszy kodu bez narzędzia innej firmy
Joseph Duty
1
Możesz także wybrać konkretny typ pliku, wybierając Look at these file types:menu rozwijane poniżej enable regular expressions box.
Moshii
1
Działa w przypadku bardzo małych projektów ... jeśli masz 100 milionów linii kodu, zajmie to trochę czasu.
bagno
10
[^\n\s]\r\npomija puste linie, nawet ze spacjami.
Zach Mierzejewski,
219

Licznik linii open source dla VS2005, 2003 i 2002 jest dostępny tutaj:

http://www.wndtabs.com/

Omówiono także tworzenie dodatku VS do liczenia linii wraz z kodem w Codeproject

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

Również zręczne edytowanie gadżetów ma ładny licznik linii, tutaj:

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

a Microsoft Visual Studio Team System 2008 zawiera dobry licznik linii.

Pamiętaj tylko:

Mierzenie postępu programowania liniami kodu jest jak mierzenie postępu budowy samolotu według masy. Bill Gates

Ali Parr
źródło
1
Często liczenie wierszy kodu jest po prostu głupie, a ilość nie oznacza jakości. Jednak ogromny zespół umieszczający Dreamliner 545,000 funtów w powietrzu to zupełnie inne osiągnięcie niż uruchomienie ultralite, który samodzielnie zbudowałem w garażu. A jeśli myślisz o liczbie wierszy kodu w systemie Windows, może Pan Bill miał na myśli to inaczej niż zwykle ...
Bezwarunkowo
18
Żadne z nich nie wydają się mieć zastosowania do Visual Studio 2010, a link slickedit jest uszkodzony.
MGOwen
57
Funkcję LOC można znaleźć w programie Visual Studio 2010 Ultimate w sekcji „Analiza> Metryki kodu”. Mam nadzieję, że dobrze ją przetłumaczyłem. Mam niemiecką wersję. Oto „Analyze”> „Codemetriken berechnen”
OneWorld,
2
dla programu Visual Studio 2012 dane LoC można znaleźć na stronie ANALYZE> Oblicz metryki kodu dla rozwiązania
tetri
2
Ponadto VS2012 zawiera tę funkcję zarówno w wersjach Ultimate, jak i Premium (a teraz także Professional).
SWalters - Przywróć Monikę
81

Oto aktualizacja programu Visual Studio 2012/2013/2015 dla tych, którzy chcą wykonać opcję „Znajdź” (która wydaje mi się najłatwiejsza): RegEx znajdzie wszystkie niepuste wiersze z kilkoma wykluczeniami, aby dać najdokładniejsze wyniki .

Wpisz następujący RegEx w polu „Znajdź”. Wybierz opcję „Użyj wyrażeń regularnych”. Zmień opcję wyszukiwania na „Bieżący projekt” lub „Całe rozwiązanie” w zależności od potrzeb. Teraz wybierz „Znajdź wszystko”. W dolnej części okna Znajdź wyniki zobaczysz „Pasujące linie”, czyli wiersze zliczania kodu.


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

Niniejszy RegEx wyklucza następujące elementy:


Komentarze

// This is a comment

Komentarze wielowierszowe (zakładając, że wiersze są poprawnie skomentowane z * przed każdą linią)

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

XML dla Intellisense

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

Komentarze HTML:

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

Za pomocą instrukcji:

using System;
using System.Web;

Otwieranie nawiasów klamrowych:

{

Zamykanie nawiasów klamrowych:

}

Uwaga: wszystko między nawiasami klamrowymi zostanie uwzględnione podczas wyszukiwania, ale w tym przykładzie liczą się tylko 4 wiersze kodu, zamiast 18 rzeczywistych niepustych wierszy:

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

Stworzyłem to, aby dać mi znacznie dokładniejszą liczbę LOC niż niektóre poprzednie opcje i pomyślałem, że podzielę się. Szefowie uwielbiają LOC, więc utknąłem z tym przez chwilę. Mam nadzieję, że ktoś inny uzna to za pomocne, daj mi znać, jeśli masz jakieś pytania lub potrzebujesz pomocy w jego uruchomieniu.

Howard Renollet
źródło
18
Uwielbiam zdanie bez komentarza. To nie powinno być dozwolone. Co z moim rozwiązaniem nie działa ??? Nie dbam nawet o głosy, chciałem tylko opublikować aktualizację dla użytkowników VS2012-2013.
Howard Renollet
Trudno odfiltrować cały wygenerowany kod (AssemblyInfo itp.), Dlatego należy preferować analizę / obliczanie kodu kodu.
MKesper,
4
Świetna robota, ale proszę wspomnieć o polu wyboru Użyj wyrażenia regularnego w sekcji Opcje wyszukiwania . To znacznie ułatwia
Gogutz 16.04.16
@MKesper, ALE TO NIE DZIAŁA DLA C ++
d7samurai
Prostsza wersja, jeśli nie ma XML ani HTML ... ^ (? ([^ \ R \ n]) \ s) * [^ \ s +? /] + [^ \ N] * $.
LastBlow,
80

Znaleziono tę wskazówkę: LOC z VS Znajdź i zamień

Nie jest to wtyczka, jeśli tego właśnie szukasz.

Mads Andersen
źródło
Uwielbiam ten, ale myślę, że znalazłem tam mały błąd w wyrażeniu. W przypadku VB.Net myślę, że powinno to być ^ ~ (: Wh @ ') ~ (: Wh @ \ #). +, A dla C # myślę, że ^ ~ (: Wh @ //) ~ (: Wh @ \ {: Wh @) ~ (: Wh @ \}: Wh @) ~ (: Wh @ \ #). + W ten sposób poprawnie obsługiwane są puste linie komentarzy i dyrektywy kompilatora. I tak działało dla mnie lepiej z VB.NET, a C # nie testowałem.
user12861,
^ ~ (: Wh @ //) ~ (: Wh @ \ {: Wh @) ~ (: Wh @ \}: Wh @) ~ (: Wh @ \ #) ~ (: Wh @ $). + Skończyło pracując lepiej dla C #, otrzymałem kilka wierszy składających się tylko z białych znaków.
user12861,
Czy nie liczy się też wszystkich linii komentowanych? Proszę tylko o linie KODU!
HydPhani,
4
Oto jeden, z którym utworzyłem, który działa w VS2012 (ten opublikowany jest nieaktualny od 2010 r.) I zawiera tylko wiersze kodu. Wyklucza wszystkie komentarze, używając dyrektyw, nawiasów klamrowych, dyrektyw xml, pustych wierszy itp., Aby dać ci tylko prawdziwy kod: ^ (?! (\ S **)) (?! (\ S * \ - \ - \>)) (?! (\ s * \ <\! \ - \ -)) (?! (\ s * \ n)) (?! (\ s ** \ /)) (?! (\ s * \ / *)) (?! (\ s * \ / \ / \ /)) (?! (\ s * \ / \ /)) (?! (\ s * \})) (? ! (\ s * \ {)) (?! (\ s (using))). * $
Howard Renollet
65

cloc to doskonała linia poleceń, oparta na Perlu, wykonywalna dla systemu Windows, która rozbija puste wiersze, wiersze z komentarzem i wiersze kodu źródłowego, pogrupowane według formatów plików.

Teraz nie będzie specjalnie działał na pliku rozwiązania VS, ale może przeszukiwać katalogi, a Ty możesz ustawić filtry nazw plików według własnego uznania.

Oto przykładowe wyniki z ich strony internetowej:

prompt> cloc perl-5.10.0.tar.gz
    4076 plików tekstowych.
    3883 unikalne pliki.                                          
    1521 plików zignorowanych.

http://cloc.sourceforge.net v 1.07 T = 10.0 s (251,0 plików / s, 84566.5 linii / s)
-------------------------------------------------- -----------------------------
Pliki językowe pusty kod komentarza skala 3. gen. ekwiwalent
-------------------------------------------------- -----------------------------
Perl 2052 110356 112521 309778 x 4,00 = 1239112,00
C 135 18718 22862 140483 x 0,77 = 108171,91
Nagłówek C / C ++ 147 7650 12093 44042 x 1,00 = 44042.00
Powłoka Bourne'a 116 3402 5789 36882 x 3,81 = 140520,42
Lisp 1 684 2242 7515 x 1,25 = 9393,75
zrobić 7 498 473 2044 x 2,50 = 5110,00
C ++ 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
Partia DOS 11 85 50 322 x 0,63 = 202,86
HTML 1 19 2 98 x 1,90 = 186,20
-------------------------------------------------- -----------------------------
SUMA: 2510 142085 156406 547174 x 2,84 = 1556285.03
-------------------------------------------------- -----------------------------

Skala ekwiwalentna trzeciej generacji to przybliżone oszacowanie, ile kodu zajmie język trzeciego pokolenia . Niezbyt przydatne, ale i tak interesujące.

Mark Rushakoff
źródło
1
Jest to świetny i bardzo łatwy w użyciu. Znacznie łatwiejsze niż rozwiązania Znajdź / Zamień i bardziej jasne, co faktycznie robi, niż opcja VS Code Metrics. Właśnie choco install cloc, a następnie cloc .w roztworze reż. Zadanie wykonane!
Rory
1
Pobrałem plik EXE systemu Windows z witryny CLOC i uruchomiłem go w folderze projektu witryny Visual Studio 2017. Działa jak urok. Podoba mi się opcja --by-file-by-lang, która wyświetla liczbę wierszy dla poszczególnych plików i języków, posortowanych od największego do najmniejszego.
humbads
42

Odpowiedzi tutaj są trochę nieaktualne, mogą pochodzić z czasu z 2008 roku. Ponieważ w nowszych wersjach programu Visual Studio 2010/2012 ta funkcja jest już wbudowana. Dlatego nie ma powodu, aby używać do tego jakiegokolwiek rozszerzenia lub narzędzi.

Funkcja zliczania linii kodu - Obliczanie danych. Za jego pomocą możesz obliczyć swoje wskaźniki (LOC, wskaźnik utrzymania, wskaźnik cyklomatyczny, głębokość dziedziczenia) dla każdego projektu lub rozwiązania.

Kliknij prawym przyciskiem myszy rozwiązanie lub projekt w Eksploratorze rozwiązań,

wprowadź opis zdjęcia tutaj

i wybierz „Oblicz dane”

wprowadź opis zdjęcia tutaj

Późniejsze dane do analizy i agregacji można zaimportować do programu Excel. Również w programie Excel możesz odfiltrować wygenerowane klasy lub inne szumy z danych. Dane te, w tym wiersze kodu LOC, można gromadzić także podczas procesu kompilacji i uwzględniać w raporcie kompilacji

Reg
źródło
2
Visual Studio 2010 posiada również te wskaźniki. Właściwie nic nowego w VS2012.
Mike Chaliy
1
Tak, ale odpowiedzi tutaj są od czasu 2008 i trochę nieaktualne, po co używać czegokolwiek lub instalować jakieś rozszerzenie, gdy jest to wbudowana funkcja. I nawet nie jest to nowa funkcja, wiele osób o niej nie wie.
Regfor
@MikeChaliy Może to być drugie zdanie wprowadzające w błąd, więc przepisałem to trochę, aby uniknąć takiego zamieszania.
Regfor
Mam rozwiązanie n-warstwowe, ale wyświetla się ten błąd: „Zgłoszono wyjątek dla celu wywołania”. dlaczego?
user197508,
5
To nie są wiersze kodu, ale linie skompilowane (tj. Po przekształceniu w IL). Myślę, że Fermin szukał gotowych wierszy.
mikeschuld,
29

Wyrażenia regularne zmieniły się między VS2010 a 2012, więc większość rozwiązań wyrażeń regularnych tutaj już nie działa

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

Znajdzie wszystkie wiersze, które nie są puste, nie są tylko pojedynczymi nawiasami („{” lub „}”), a nie tylko #include lub innym preprocesorem.

Użyj Ctrl- shift- fi upewnij się, że wyrażenia regularne są włączone.

Odpowiednie wyrażenie regularne dla VS 2010 i starszych to

^~(:Wh@//.+)~(:Wh@\{:Wh@)~(:Wh@\}:Wh@)~(:Wh@/#).+
użytkownik2711915
źródło
19

W Visual Studio Team System 2008 możesz to zrobić z menu Analizuj -> „Oblicz metryki kodu dla rozwiązania”, a to da ci liczbę wierszy całego twojego rozwiązania (między innymi g )

Christopher Klein
źródło
12
Visual Studio Team System 2008 nie potrafi zliczyć niezarządzanego kodu. ;)
Christian
11

Prostym rozwiązaniem jest wyszukiwanie we wszystkich plikach. Wpisz „*” podczas używania symboli wieloznacznych. Który pasowałby do wszystkich linii. Na końcu okna wyników wyszukiwania powinna pojawić się linia:

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

Oczywiście nie jest to bardzo dobre w przypadku dużych projektów, ponieważ wszystkie linie są macowane i ładowane do pamięci, aby wyświetlić je w oknie wyników wyszukiwania.

Odniesienie:

Sogartar
źródło
4

Oczywiście narzędzia są łatwiejsze, ale czuję się świetnie, robiąc to w PowerShell :)

Ten skrypt znajduje wszystkie odniesienia .csproj w pliku .sln, a następnie w każdym pliku csproj lokalizuje pliki dołączone do kompilacji. Dla każdego pliku dołączonego do kompilacji tworzy obiekt o właściwościach: Rozwiązanie, Projekt, Plik, Linie. Przechowuje wszystkie te obiekty na liście, a następnie grupuje i wyświetla dane w razie potrzeby.

#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
źródło
3

Użyj Menu-> Analiza -> Oblicz metryki kodu w Visual Studio 2010 Ultimate.

sunil
źródło
2

Możesz użyć bezpłatnego narzędzia SourceMonitor

Daje wiele miar: linie kodu, liczba instrukcji, złożoność, głębokość bloku

Ma wyjścia graficzne za pomocą wykresów

Hovhannes Hakobyan
źródło
1

Wymyśliłem szybki i brudny skrypt PowerShell do zliczania linii w strukturze folderów. Nie jest tak w pełni funkcjonalny, jak niektóre inne narzędzia wymienione w innych odpowiedziach, ale myślę, że jest wystarczająco dobry, aby zapewnić przybliżone porównanie wielkości plików kodu względem siebie w projekcie lub rozwiązaniu.

Skrypt można znaleźć tutaj:

https://gist.github.com/1674457

Jesse Taber
źródło
0

W Visual Studio 2015 przejdź do menu Analiza i wybierz „Oblicz metryki kodu”.

Atters
źródło