Come si contano le righe di codice in una soluzione di Visual Studio?


800

È possibile trovare il numero di righe di codice in un'intera soluzione? Ho sentito parlare di MZ-Tools , ma esiste un equivalente open source?


24
Sono d'accordo che non aiuta molto, ma se la direzione lo richiede ...
Fermin

33
LoC è semplicemente una metrica ed è particolarmente interessante in 2 casi: 1) per avere un'idea di quanto sia grande la base di codice, cioè quando ti unisci a una nuova squadra 2) per misurare i tuoi progressi quando cerchi di rendere la tua base di codice più compatta
Piotr Owsiak

191
Alcune persone qui affermano che contare le righe di codice è inutile senza pensarci bene. È abbastanza utile in quanto è una metrica che dovrebbe essere generalmente ridotta al minimo. È un modo semplice per misurare la complessità della soluzione (non l'efficienza) e se il problema è noto per essere semplice, maggiore è il numero di righe di codice, generalmente minore è la qualità. Un'altra cosa è perché le persone si preoccupano di rispondere se è solo per dire che la domanda è negativa? Cosa penseresti se un insegnante ti dicesse che la tua domanda non dovrebbe essere posta.

77
In VS2010 è presente uno strumento integrato che conta tutte le righe di codice e anche altri valori: vai su Visualizza -> Altre finestre -> Risultati delle metriche del codice. Un piccolo pulsante nell'angolo che assomiglia a un calendario, fai clic su quello, il suggerimento dovrebbe dire Calcola le metriche del codice per l'anima e lascia che VS faccia il suo dovere.
user959631,

64
La persona non ha sempre bisogno di dirti perché vogliono contare il codice. Quando la domanda è semplicemente affermata, il caso intorno al perché è irrilevante. Rispondi alla sua domanda. Odio che. Ci sono momenti in cui chiedere perché, quando è chiaramente necessario, e ci sono volte in cui non lo si vede (quando non si vede personalmente un bisogno ... e si sta solo dando fastidio al poster con arroganza).
Positivo

Risposte:


525

Visual Studio 2010 Ultimate ha questo incorporato:

Analizza → Calcola metriche di codice


12
Ultimate e Premium, penso
Stefan Dragnev il

39
Avvertenza: questo fa molte altre cose oltre al semplice conteggio delle righe. Elenca anche "Indice di manutenibilità", "Complessità ciclomatica", "Profondità di ereditarietà" e "Accoppiamento di classe", che sono tutti abbastanza complicati da calcolare e non è possibile eseguire le metriche solo per una parte di esso. Ciò significa che se la tua base di codice è particolarmente grande, potresti essere seduto per ore ad aspettarlo. Se tutto ciò che vuoi è il conteggio delle linee, ci sono soluzioni molto più veloci là fuori.
Darrel Hoffman,

4
anche su vs2012 ultimate =)
oCcSking

9
VS 2013 ha Analizza -> Calcola le metriche del codice
Dinesh Rajan

42
Peccato che questo non funzioni con progetti C ++ nativi (almeno non in VS2013).
Cameron,

844

Ho trovato utile PowerShell per questo. Considero comunque LoC una metrica piuttosto fasulla, quindi non credo che dovrebbe essere richiesto qualcosa di più formale.

Dalla directory di una soluzione piccola:

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

Ciò conterà le righe non vuote in tutti i file .cs e .xaml della soluzione. Per un progetto più ampio, ho appena usato un elenco di estensioni diverso:

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

Perché usare un'intera app quando lo farà una singola riga di comando? :)


19
(L'unica volta che mi è mai stato chiesto di fornire i conteggi delle linee è stato quando il vertice aziendale ha capito quanto tempo ci sarebbe voluto per migrare tutti i nostri prodotti all'estero in modo da poter chiudere il nostro sito nazionale.)
Greg D

8
(Sì, questo include file e commenti codificati. No, questo non mi dà fastidio. Anche i designer, il codice gen e i commenti devono essere mantenuti.)
Greg D

27
molto bello, completamente dimenticato di PowerShell. dovrebbe diventare la sostituzione di default per cmd
lubos hasko il

4
Eccellente! Il tuo commento finale lo riassume davvero, è un compito banale, quindi perché usare uno strumento non banale? Anche se penso davvero che dovrebbe essere incluso in tutte le versioni di VS.
Sune Rievers,

13
Se si desidera escludere i file di backup generati per XAML, è sufficiente aggiungere un parametro -esclude: (dir -exclude *.g.cs -include *.cs,*.xaml -recurse | select-string .).Count
EZ Hart

349

Ho usato Ctrl+ Shift+ F. Successivamente, inserisci a \nnella casella di ricerca e abilita la casella delle espressioni regolari. Quindi, nei risultati di ricerca, alla fine della schermata sono indicati il ​​numero di file cercati e le righe di codice trovate.

Puoi usare [^\n\s]\r\nper saltare le righe vuote e solo spaziali (crediti a Zach nei commenti).


16
Questa soluzione include erroneamente righe vuote, commenti, documentazione e istruzioni divise. Per molte applicazioni, quelle non dovrebbero essere considerate come righe di codice.
Jay Baxter,

1
Sebbene sia leggermente impreciso (se in realtà usi \ n nel tuo codice, quella riga verrà contata due volte), è comunque la risposta migliore se hai bisogno di una ROM di righe di codice senza uno strumento di terze parti
Joseph Duty

1
È inoltre possibile selezionare un tipo di file specifico selezionando un Look at these file types:menu a discesa delle opzioni di seguito enable regular expressions box.
Moshii,

1
Funziona per progetti molto piccoli ... quando hai 100 milioni di righe di codice, questo richiederà del tempo.
palude

11
[^\n\s]\r\nsalta le righe vuote, anche con spazi all'interno.
Zach Mierzejewski,

219

Un contatore di linee open source per VS2005, 2003 e 2002 è disponibile qui:

http://www.wndtabs.com/

Qui si discute anche della creazione di un addin VS conteggio delle righe, completo di codice su Codeproject

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

Anche Slick Edit Gadget ha un bel contatore di linee, qui:

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

e Microsoft Visual Studio Team System 2008 include un buon contatore di linee.

Ricorda però:

Misurare l'avanzamento della programmazione mediante righe di codice è come misurare il progresso della costruzione di aeromobili in base al peso. Bill Gates


1
Spesso il conteggio delle righe di codice è Semplicemente sciocco e la quantità non implica qualità. Tuttavia, una grande squadra che mette in scena un Dreamliner da 545.000 libbre (545.000 libbre !!) è un risultato completamente diverso rispetto al lancio dell'ultralite che ho costruito da solo nel mio garage. E se pensi al numero di righe di codice in Windows, forse il signor Bill intendeva questo in un modo diverso da quello che di solito viene preso ...?
Incondizionatamente

18
Nessuno di questi sembra applicarsi a Visual Studio 2010 e il collegamento slickedit è interrotto.
MGOwen,

57
La funzione LOC in Visual Studio 2010 Ultimate è disponibile in "Analisi> Metriche del codice" . Spero di averla tradotta correttamente. Ho la versione tedesca. Eccolo "Analizza"> "Codemetriken berechnen"
OneWorld

2
per Visual Studio 2012 la metrica LoC può essere trovata su ANALYZE> Calcola le metriche del codice per la soluzione
tetri

2
Inoltre, VS2012 include questa funzione in entrambe le versioni Ultimate e Premium (e ora anche Professional).
SWalters - Ripristina Monica il

81

Ecco un aggiornamento per Visual Studio 2012/2013/2015 per coloro che vogliono fare l'opzione "Trova" (che trovo sia la più semplice): questo RegEx troverà tutte le righe non vuote con diverse esclusioni per fornire i risultati più accurati .

Immettere il seguente RegEx nella casella "Trova". Assicurati di selezionare l'opzione "Usa espressioni regolari". Modificare l'opzione di ricerca su "Progetto corrente" o "Soluzione completa" in base alle proprie esigenze. Ora seleziona "Trova tutto". Nella parte inferiore della finestra Trova risultati , vedrai "Linee corrispondenti", ovvero le righe del conteggio del codice.


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

Questo RegEx esclude i seguenti articoli:


Commenti

// This is a comment

Commenti su più righe (supponendo che le righe siano correttamente commentate con un * davanti a ciascuna riga)

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

XML per Intellisense

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

Commenti HTML:

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

Utilizzando dichiarazioni:

using System;
using System.Web;

Apertura di parentesi graffe:

{

Parentesi graffe di chiusura:

}

Nota: qualsiasi cosa tra le parentesi graffe verrebbe inclusa nella ricerca, ma in questo esempio contano solo 4 righe di codice, anziché 18 righe non vuote effettive:

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

Ho creato questo per darmi un conteggio LOC molto più accurato rispetto ad alcune opzioni precedenti e ho pensato che avrei condiviso. I boss adorano i conteggi di LOC, quindi sono bloccato per un po '. Spero che qualcun altro possa trovare questo utile, fammi sapere se hai domande o hai bisogno di aiuto per farlo funzionare.


18
Adoro il downvote senza commento. Questo non dovrebbe essere permesso. E la mia soluzione non funziona ??? Non mi importa nemmeno dei voti, volevo solo pubblicare un aggiornamento per gli utenti di VS2012-2013.
Howard Renollet,

Difficile filtrare tutto il codice generato (AssemblyInfo ecc.), Pertanto è preferibile analizzare / calcolare le metriche del codice.
MKesper,

4
Ottimo lavoro, ma menziona la casella di controllo Usa espressione regolare nella sezione Trova opzioni . Rende molto più facile
Gogutz,

@MKesper MA CHE NON FUNZIONA PER C ++
d7samurai

Una versione più semplice se non XML, né HTML ... ^ (? ([^ \ R \ n]) \ s) * [^ \ s +? /] + [^ \ N] * $.
LastBlow

80

Trovato questo suggerimento: LOC con VS Trova e sostituisci

Non un plug-in, tuttavia, se è quello che stai cercando.


Adoro questo, ma penso di aver trovato un piccolo errore nell'espressione lì. Per VB.Net penso che dovrebbe essere ^ ~ (: Wh @ ') ~ (: Wh @ \ #). + E per C # penso ^ ~ (: Wh @ //) ~ (: Wh @ \ {: Wh @) ~ (: Wh @ \}: Wh @) ~ (: Wh @ \ #). + In questo modo vengono trattate correttamente le righe di commento vuote e le direttive del compilatore. Per me ha funzionato meglio con VB.NET e C # non l'ho ancora testato.
user12861

^ ~ (: Wh @ //) ~ (: Wh @ \ {: Wh @) ~ (: Wh @ \}: Wh @) ~ (: Wh @ \ #) ~ (: Wh @ $). + Finito lavorando meglio per C #, stavo ottenendo alcune righe composte solo da spazi bianchi.
user12861

Non conta anche tutte le righe commentate? Solo righe di CODICE per favore!
HydPhani,

4
Eccone uno con cui ho lavorato che funziona in VS2012 (quello pubblicato è obsoleto dal 2010) e conta solo righe di codice. Esclude tutti i commenti, usando direttive, parentesi graffe, direttive xml, righe vuote, ecc .... per darti un vero codice conta solo: ^ (?! (\ S **)) (?! (\ S * \ - \ - \?!>)) ((\ s * \ <\ \ -! \ -?!?!)) ((\ s * \ n)) ((\ s ** \ /)) (?! (\ s * \ / *)) (?! (\ s * \ / \ / \ /)) (?! (\ s * \ / \ /)) (?! (\ s * \})) (? ! (\ s * \ {)) (?! (\ s (using))). * $
Howard Renollet

65

cloc è un eccellente commandline , basato su Perl, eseguibile da Windows che spezzerà le righe vuote, le righe commentate e le righe di codice sorgente, raggruppate per formati di file.

Ora non verrà eseguito in modo specifico su un file di soluzione VS, ma può ricorrere attraverso le directory e puoi impostare i filtri del nome file come ritieni opportuno.

Ecco l'output di esempio dalla loro pagina Web:

prompt> cloc perl-5.10.0.tar.gz
    4076 file di testo.
    3883 file unici.                                          
    1521 file ignorati.

http://cloc.sourceforge.net v 1.07 T = 10.0 s (251,0 file / s, 84566,5 righe / s)
-------------------------------------------------- -----------------------------
File di lingua in bianco scala di commenti codice terza generazione. equiv
-------------------------------------------------- -----------------------------
Perl 2052 110356 112521 309778 x 4.00 = 1239112.00
C 135 18718 22862 140483 x 0,77 = 108171,91
Intestazione C / C ++ 147 7650 12093 44042 x 1.00 = 44042.00
Bourne Shell 116 3402 5789 36882 x 3.81 = 140520.42
Lisp 1 684 2242 7515 x 1,25 = 9393,75
fare 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
Lotto DOS 11 85 50 322 x 0,63 = 202,86
HTML 1 19 2 98 x 1,90 = 186,20
-------------------------------------------------- -----------------------------
SOMMA: 2510 142085 156406 547174 x 2,84 = 1556285,03
-------------------------------------------------- -----------------------------

La scala equivalente di terza generazione è una stima approssimativa di quanto codice sarebbe necessario in una lingua di terza generazione . Non terribilmente utile, ma comunque interessante.


1
Questo è fantastico e super facile da usare. Molto più semplice delle soluzioni Trova / Sostituisci e più chiaro cosa sta effettivamente facendo rispetto all'opzione Metriche VS Code. Giusto choco install cloce poi cloc .nella tua soluzione dir. Lavoro fatto!
Rory,

1
Ho scaricato il file EXE di Windows dal sito Web CLOC e l'ho eseguito nella mia cartella di progetto del sito Web di Visual Studio 2017. Ha funzionato come un fascino. Mi piace l'opzione --by-file-by-lang che elenca il conteggio delle righe per singolo file e lingua, ordinati dal più grande al più piccolo.
humbads

42

Le risposte qui sono un po 'obsolete, potrebbero essere rispetto al 2008. Perché nelle versioni più recenti di Visual Studio 2010/2012, questa funzionalità è già integrata. Pertanto, non vi è motivo di utilizzare alcuna estensione o strumento per esso.

Funzione per contare le righe di codice - Calcola metriche. Con esso è possibile calcolare le metriche (LOC, indice di manutenzione, indice ciclomatico, profondità dell'eredità) per ciascun progetto o soluzione.

Basta fare clic destro sulla soluzione o progetto in Esplora soluzioni,

inserisci qui la descrizione dell'immagine

e seleziona "Calcola metriche"

inserisci qui la descrizione dell'immagine

I dati successivi per analisi e aggregazione potrebbero essere importati in Excel. Anche in Excel puoi filtrare le classi generate o altro rumore dalle tue metriche. Queste metriche, incluse le righe di codice LOC, possono essere raccolte anche durante il processo di compilazione e incluse nel report di compilazione


2
Anche Visual Studio 2010 ha queste metriche. In realtà niente di nuovo in VS2012.
Mike Chaliy,

1
Sì, ma le risposte qui sono tra il 2008 e un po 'obsolete, perché usare qualcosa o installare un'estensione quando è una funzionalità integrata. E anche non è una nuova funzionalità che molte persone non conoscono.
Regfor

@MikeChaliy Potrebbe essere la seconda frase introduttiva a confonderti, quindi l'ho riscritta un po 'per evitare tale confusione.
Regfor

ho una soluzione n-layer ma che visualizza questo errore: "Eccezione è stata generata dal target di una chiamata." perché?
user197508

5
Non si tratta di righe di codice, ma di linee compilate (ovvero dopo che sono state trasformate in IL). Penso che Fermin stesse cercando linee precompilate.
Mikeschuld,

29

Le espressioni regolari sono cambiate tra VS2010 e 2012, quindi la maggior parte delle soluzioni per espressioni regolari qui non funzionano più

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

Troverà tutte le righe che non sono vuote, non sono solo una singola parentesi ('{' o '}') e non solo un #include o un altro preprocessore.

Usa Ctrl- shift- fe assicurati che le espressioni regolari siano abilitate.

L'espressione regolare corrispondente per VS 2010 e precedenti è

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

19

In Visual Studio Team System 2008 è possibile eseguire dal menu Analizza -> 'Calcola metriche di codice per soluzione' e ti darà un conteggio di riga dell'intera soluzione (tra le altre cose g )


12
Visual Studio Team System 2008 non riesce a contare il codice non gestito. ;)
Christian


11

Una soluzione semplice è cercare in tutti i file. Digita "*" mentre usi i caratteri jolly. Che corrisponderebbe a tutte le linee. Alla fine della finestra di ricerca dei risultati dovresti vedere una riga dell'ordinamento:

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

Naturalmente questo non è molto buono per i grandi progetti, poiché tutte le linee vengono elaborate e caricate in memoria per essere disperse nella finestra dei risultati della ricerca.

Riferimento:




4

Ovviamente gli strumenti sono più facili, ma mi sento bene farlo in PowerShell :)

Questo script trova tutti i riferimenti .csproj nel file .sln, quindi all'interno di ciascun file csproj individua i file inclusi per la compilazione. Per ogni file incluso per la compilazione crea un oggetto con proprietà: Soluzione, Progetto, File, Linee. Memorizza tutti questi oggetti in un elenco, quindi raggruppa e proietta i dati secondo necessità.

#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

Usa l'opzione Menu-> Analizza -> Calcola metriche di codice in Visual Studio 2010 Ultimate.





2

Puoi usare lo strumento gratuito SourceMonitor

Fornisce molte misure: righe di codice, conteggio delle istruzioni, complessità, profondità del blocco

Ha output grafici tramite grafici



1

Ho ideato uno script PowerShell veloce e sporco per contare le linee in una struttura di cartelle. Non è così completo come alcuni degli altri strumenti citati in altre risposte, ma penso che sia abbastanza buono da fornire un confronto approssimativo della dimensione dei file di codice l'uno rispetto all'altro in un progetto o in una soluzione.

Lo script può essere trovato qui:

https://gist.github.com/1674457



0

In Visual Studio 2015 vai al menu Analizza e seleziona "Calcola metriche di codice".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.