您如何计算Visual Studio解决方案中的代码行数?


800

是否有可能找到整个解决方案中的代码行数?我听说过MZ-Tools,但是有一个等效的开源软件吗?


24
我同意这并没有太大帮助,但是如果管理层要求的话……
Fermin

33
LoC只是一个度量标准,在2种情况下特别有趣:1)了解代码库的大小,例如,当您加入新团队时2)试图使代码库更紧凑时
评估进度

191
这里有些人说,如果不加考虑的话,对代码行进行计数是没有用的。它非常有用,因为它通常应被最小化。这是一种衡量解决方案复杂性(而不是效率)的简单方法,如果已知问题很简单,则代码行越多,质量通常就越低。另一件事是,如果只是说这个问题是一个坏问题,为什么人们会打扰呢?如果不告诉老师您的问题,您会怎么想。

77
在VS2010中,有一个内置工具也可以计算所有代码行和其他值:转到“视图”->“其他Windows”->“代码指标”结果。拐角处的一个小按钮看起来像一个日历,单击该按钮,工具提示应显示“计算解决方案的代码度量标准”,然后让VS完成。
user959631 2012年

64
该人员并不需要总是告诉您为什么他们要计算代码。当问题简单地说出来时,关于为什么的情况就无关紧要了。请回答他的问题。我讨厌那个。有时会问为什么清楚地需要,然后有时又不需要(当您个人没有看到需求...而只是夸大了海报)。
PositiveGuy

Answers:


524

Visual Studio 2010 Ultimate具有以下内置功能:

分析→计算代码指标


12
我认为Ultimate和Premium
Stefan Dragnev

39
警告:除了行数之外,这还可以做很多其他事情。它还列出了“可维护性指数”,“循环复杂性”,“继承深度”和“类耦合”,所有这些都计算起来相当复杂,您不能仅对其中一部分运行度量。这意味着,如果您的代码库特别大,您可能要坐几个小时才能等待它。如果您只需要行数,则可以找到更快的解决方案。
Darrel Hoffman 2012年

4
同样在vs2012终极版=)
oCcSking 2013年

9
VS 2013具有分析->计算代码指标
Dinesh Rajan

42
不幸的是,这不适用于本机C ++项目(至少在VS2013中不起作用)。
卡梅伦2014年

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
(我唯一一次被要求提供生产线数量的时候是高层管理人员弄清楚将我们所有产品迁移到海外需要多少时间,以便他们可以关闭我们的国内站点。)
Greg D

8
(是的,这包括代码生成的文件和注释。不,这不会打扰我。设计师,生成的代码和注释也需要维护。)
Greg D,2009年

27
非常好,完全忘记了powershell。它应该成为cmd的默认替代品
lubos hasko 2010年

4
优秀的!您最后的评论实际上是对它的总结,这是一项琐碎的任务,那么为什么要使用非琐碎的工具呢?虽然我真的认为它应该包含在所有版本的VS中。
苏恩·里维尔斯

13
如果要排除为XAML生成的后备文件,只需添加-exclude开关即可:(dir -exclude *.g.cs -include *.cs,*.xaml -recurse | select-string .).Count
EZ Hart

347

我用Ctrl+ Shift+ F。接下来,\n在搜索框中输入a并启用正则表达式框。然后在查找结果中,屏幕末尾是搜索的文件数和找到的代码行。

您可以使用[^\n\s]\r\n跳过空白行和仅空格行(在注释中注明Zach)。


16
此解决方案错误地包括空白行,注释,文档和split语句。对于许多应用程序,这些不应视为代码行。
杰·巴克斯特

1
尽管这有点不准确(如果您在代码中实际使用\ n,那么该行将被重复计算),但如果您需要不带第三方工具的代码行ROM,则这仍然是最佳答案
Joseph Duty

1
您也可以通过选择选项Look at these file types:下拉列表中的选项来选择特定的文件类型enable regular expressions box
Moshii 2015年

1
适用于非常小的项目...当您有一亿行代码时,这将需要一些时间。
沼泽

10
[^\n\s]\r\n跳过空白行,即使其中有空格也是如此。
Zach Mierzejewski

219

VS2005、2003和2002的开源行计数器可在此处获得:

http://www.wndtabs.com/

这里还讨论了创建行计数VS插件的过程,并在Codeproject上完成了代码

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

Slick Edit小工具也有不错的行数计数器,在这里:

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

Microsoft Visual Studio Team System 2008包括一个不错的线路计数器。

不过请记住:

用代码行衡量编程进度就像按重量衡量飞机建造进度。比尔盖茨


1
通常,对代码行进行计数只是“傻傻”,而数量并不意味着质量。但是,一支庞大的团队将一个545,000磅(545,000磅!)的Dreamliner放在空中,与发射我在车库中单手建造的Ultralite相比,是完全不同的成就。而且,如果您考虑Windows中的代码行数,也许Bill先生的意思与通常所采取的方式不同……?
无条件

18
这些似乎都不适用于Visual Studio 2010,并且slickedit链接已损坏。
MGOwen

57
您可以在Visual Studio 2010 Ultimate中的“分析>代码指标”下找到LOC功能,希望我将其翻译正确。我有德文版。那里是“分析”>“ Codemetriken berechnen”
OneWorld

2
对于Visual Studio 2012,可以在ANALYZE>计算解决方案的代码度量标准中
tetri

2
此外,VS2012在Ultimate和Premium版本(以及现在的Professional)中都包含此功能。
突击队-恢复莫妮卡

81

这是Visual Studio 2012/2013/2015的更新版,适用于那些希望使用“查找”选项(我觉得这是最简单的)的用户:此RegEx将查找所有非空白行,其中包含多个排除项,以提供最准确的结果。

在“查找”框中输入以下RegEx。请确保选择“使用正则表达式”选项。根据需要将搜索选项更改为“当前项目”或“整个解决方案”。现在选择“查找全部”。在“ 查找结果”窗口的底部,您将看到“匹配行”,即代码计数的行。


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

此正则表达式不包括以下项目:


注释

// This is a comment

多行注释(假设正确注释了各行,并在每行前面加*)

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

用于Intellisense的XML

/// <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
爱无记名投票,无可奉告。这不应该被允许。我的解决方案怎么办?我什至不在乎投票,我只是想为VS2012-2013用户发布更新。
Howard Renollet 2014年

很难过滤掉所有生成的代码(AssemblyInfo等),因此应首选“分析/计算代码指标”。
MKesper '16

4
很好,但是请在“ 查找选项”部分提及“ 使用正则表达式”复选框。它变得更容易
Gogutz

@MKesper但不适用于C ++
d7samurai

如果没有XML,也没有HTML ... ^(?([[^ \ r \ n])\ s)* [^ \ s +?/] + [^ \ n] * $。
LastBlow

80

找到了这个提示: LOC with VS查找并替换

不是一个插件,虽然那是您要找的东西。


我喜欢这个,但我认为我在该表达式中发现了一个小错误。对于VB.Net,我认为应该是^〜(:Wh @')〜(:Wh @ \#)。+;对于C#,我认为应该是^〜(:Wh @ //)〜(:Wh @ \ {:Wh @)〜(:Wh @ \}:Wh @)〜(:Wh @ \#)。+这样可以正确处理空白注释行和编译器指令。无论如何,它对于VB.NET来说对我来说效果更好,而且我还没有测试过C#。
user12861 2011年

^〜(:Wh @ //)〜(:Wh @ \ {:Wh @)〜(:Wh @ \}:Wh @)〜(:Wh @ \#)〜(:Wh @ $)。为C#工作得更好,我得到了一些仅由空格组成的行。
user12861 2011年

它也不算所有注释行吗?请仅执行CODE行!
HydPhani

4
这是我在VS2012中使用的一种(发布的内容在2010年已过时),并且仅计算代码行数。它使用指令,花括号,xml指令,空白行等排除所有注释,只给您一个真正的代码:^(?!(\ s **))(?!(\ s * \ -\-\>))(?!(\ s * \ <\!\-\-))(?!(\ s * \ n))(?!(\ s ** \ /))(?! (\ s * \ / *))(?!(\ s * \ / \ / \ //))(?!(\ s * \ / \ /))(?!(\ s * \}))(? !(\ s * \ {))(?!(\ s(using)))。* $
Howard Renollet

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 s(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
伯恩壳牌116 3402 5789 36882 x 3.81 = 140520.42
Lisp 1684 2242 7515 x 1.25 = 9393.75
赚7498473 2044 x 2.50 = 5110.00
C ++ 10312277 2000 x 1.51 = 3020.00
XML 26231 0 1972 x 1.90 = 3746.80
yacc 212897 1549 x 1.51 = 2338.99
YAML 2 2 0 489 x 0.90 = 440.10
DOS批次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”(VS代码度量)选项更清楚其实际功能。只是choco install cloc,然后cloc .在您的解决方案目录。任务完成!
罗里

1
我从CLOC网站下载了Windows EXE,并在Visual Studio 2017网站项目文件夹中运行了该文件。像魅力一样工作。我喜欢--by-file-by-lang选项,该选项列出了每种文件和语言的行数,从最大到最小排序。
汉巴德(Humbads)'18

42

这里的答案有点过时了,可能是从2008年开始的。因为在较新的Visual Studio版本2010/2012中,此功能已内置。因此,没有理由为其使用任何扩展程序或工具。

计数代码行的功能-计算指标。有了它,您可以为每个项目或解决方案计算指标(LOC,Maintaince索引,Cyclomatic索引,继承深度)。

只需在解决方案资源管理器中右键单击解决方案或项目,

在此处输入图片说明

然后选择“计算指标”

在此处输入图片说明

以后可以将用于分析和汇总的数据导入Excel。同样,在Excel中,您可以从指标中过滤掉生成的类或其他杂音。这些指标(包括代码行LOC)也可以在构建过程中收集,并包含在构建报告中


2
Visual Studio 2010也具有此指标。实际上,VS2012中没有任何新内容。
Mike Chaliy 2012年

1
是的,但是这里的答案是从2008年开始的,而且有些过时了,为什么要使用任何功能或安装一些扩展功能是内置功能。而且,即使它不是新功能,很多人也不知道。
Regfor 2012年

@MikeChaliy可能是第二个简介句子使您感到困惑,所以为了避免这种困惑,我对它进行了一些重写。
Regfor 2012年

我有一个n层解决方案,但显示此错误:“调用的目标引发了异常。” 为什么?
user197508 2012年

5
这不是代码行,而是编译行(即,将其转换为IL之后)。我认为Fermin正在寻找预编译的行。
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中,您可以从菜单Analyze->“计算解决方案的代码度量”进行操作,它将为您提供整个解决方案的行数(除其他外,g


12
Visual Studio Team System 2008无法管理非托管代码。;)
基督教徒


11

一个简单的解决方案是搜索所有文件。使用通配符时输入“ *”。这将匹配所有行。在“查找结果”窗口的末尾,您应该看到以下一行:

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

当然,这对于大型项目而言不是很好,因为所有行都已行进并加载到内存中,以便在查找结果窗口中支付。

参考:




4

显然工具更容易,但是我在Powershell中这样做很酷:)

该脚本在.sln文件中找到所有.csproj引用,然后在每个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中使用“菜单”->“分析”->“计算代码指标”选项。







1

我想出了一个快速而肮脏的powershell脚本,用于对文件夹结构中的行进行计数。它的功能不如其他答案中提到的其他工具那样完整,但是我认为它足以对项目或解决方案中的代码文件之间的大小进行粗略比较。

脚本可以在这里找到:

https://gist.github.com/1674457



0

在Visual Studio 2015中,转到“分析”菜单,然后选择“计算代码指标”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.