【问题标题】:How do you count the lines of code in a Visual Studio solution?如何计算 Visual Studio 解决方案中的代码行数?
【发布时间】:2010-11-17 16:48:46
【问题描述】:

是否可以找到整个解决方案中的代码行数?我听说过MZ-Tools,但是有没有开源的等价物?

【问题讨论】:

  • 我同意这没有多大帮助,但如果管理层要求...
  • LoC 只是一个指标,在 2 种情况下特别有趣:1) 了解代码库有多大,即当您加入新团队时 2) 衡量您在尝试制作时的进度你的代码库更紧凑
  • 这里有人说如果不好好考虑,计算代码行数是没有用的。它非常有用,因为它是一个通常应该最小化的指标。这是衡量解决方案复杂性(而不是效率)的一种简单方法,如果已知问题很简单,那么代码行数越多,质量通常越低。另一件事是,如果只是说问题不好,为什么人们还要费心回应?如果老师告诉你你的问题不应该被问到,你会怎么想。
  • 在 VS2010 中有一个内置工具可以计算所有代码行和其他值:转到查看 -> 其他窗口 -> 代码度量结果。角落里一个看起来像日历的小按钮,点击它,工具提示应该说为解决方案计算代码指标,然后让 VS 来做。
  • 这个人并不总是需要告诉你他们为什么要计算代码。当这个问题被简单地陈述时,围绕为什么的案例是无关紧要的。只要回答他的问题。我讨厌那个。有时会问为什么当你明确需要时,有时你却不需要(当你个人认为没有必要......并且只是傲慢地纠缠海报)。

标签: visual-studio code-metrics lines-of-code line-count


【解决方案1】:

我发现 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>

当单个命令行可以完成时,为什么要使用整个应用程序? :)

【讨论】:

  • (我被要求提供线数的唯一一次是,高层管理人员正在计算将我们所有的产品迁移到海外需要多长时间才能关闭我们的国内站点。 )
  • (是的,这包括代码生成的文件和 cmets。不,这不会打扰我。设计师、生成的代码和 cmets 也需要维护。)
  • 非常好,完全忘记了powershell。它应该成为 cmd 的默认替换
  • 太棒了!您的结尾评论确实总结了它,这是一项微不足道的任务,那么为什么要使用非平凡的工具呢?虽然我真的认为它应该包含在所有版本的 VS 中。
  • 如果您想排除为 XAML 生成的支持文件,您只需添加一个 -exclude 开关:(dir -exclude *.g.cs -include *.cs,*.xaml -recurse | select-string .).Count
【解决方案2】:

Visual Studio has built-in code metrics,包括代码行:

分析 → 计算代码指标

【讨论】:

  • 终极和高级,我认为
  • 警告:除了简单的行数之外,它还有很多其他的功能。它还列出了“可维护性指数”、“循环复杂性”、“继承深度”和“类耦合”,所有这些计算起来都相当复杂,而且你不能只运行其中一部分的指标。这意味着如果您的代码库特别大,您可能会坐上几个小时等待它。如果您想要的只是行数,还有更快的解决方案。
  • VS 2013 有分析 --> 计算代码指标
  • 太糟糕了,这不适用于本机 C++ 项目(至少在 VS2013 中不起作用)。
  • 值得注意的是,根据msdn计算的LoC数量是基于IL,而不是实际代码
【解决方案3】:

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

您可以使用[^\n\s]\r\n 跳过空白行和仅包含空格的行(在 cmets 中归功于 Zach)。

【讨论】:

  • 此解决方案错误地包括空行、cmets、文档和拆分语句。对于许多应用程序,这些不应算作代码行数。
  • 虽然它有点不准确(如果你真的在你的代码中使用 \n,那行将被重复计算),如果你需要一个没有第三行的代码行的 ROM,它仍然是最好的答案派对工具
  • 您还可以通过在enable regular expressions box 下方选择Look at these file types: 下拉列表来选择特定文件类型。
  • 适用于非常小的项目...当您有 1 亿行代码时,这将需要一些时间。
  • [^\n\s]\r\n 会跳过空白行,即使其中有空格。
【解决方案4】:

这里提供了 VS2005、2003 和 2002 的开源行计数器:

http://www.wndtabs.com/

还有关于创建行计数 VS 插件的讨论,这里包含 Codeproject 上的代码

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

Slick Edit Gadgets 也有一个不错的行计数器,在这里:

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

Microsoft Visual Studio Team System 2008 包含一个很好的线路计数器。

请记住:

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

【讨论】:

  • 通常计算代码行数只是简单的傻事,数量并不意味着质量。然而,一个庞大的团队将 545,000 磅(545,000 磅!!)梦幻客机投入空中,这与发射我在车库中单枪匹马建造的 Ultralite 是完全不同的成就。如果您考虑 Windows 中的代码行数,比尔先生的意思可能与通常的不同......?
  • 这些似乎都不适用于 Visual Studio 2010,并且 slickedit 链接已损坏。
  • 您可以在 Visual Studio 2010 Ultimate 中的 "Analysis > Code metrics" 下找到 LOC 功能,希望我翻译正确。我有德文版。那里是“分析”>“Codemetriken berechnen”
  • 对于 Visual Studio 2012,可以在 ANALYZE > Calculate Code Metrics for Solution 中找到 LoC 指标
  • 此外,VS2012 在 Ultimate 和 Premium 版本(现在也包括 Professional)中都包含此功能。
【解决方案5】:

以下是 Visual Studio 2012/2013/2015 的更新,适用于那些想要执行“查找”选项(我发现这是最简单的)的用户:此 RegEx 将查找所有非空行以及几个排除项,以提供最准确的结果。

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


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

此 RegEx 不包括以下项目:


评论

// This is a comment

多行 cmets(假设行正确注释为每行前面的 *)

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

用于智能感知的 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 计数,所以我坚持了一段时间。我希望其他人会发现这对您有所帮助,如果您有任何问题或需要帮助以使其正常工作,请告诉我。

【讨论】:

  • 喜欢不加评论的反对票。这不应该被允许。我的解决方案不起作用怎么办???我什至不在乎投票,我只是想为 VS2012-2013 用户发布更新。
  • 很难过滤掉所有生成的代码(AssemblyInfo 等),因此应该首选分析/计算代码指标。
  • 干得好,但请提及查找选项部分下的使用正则表达式复选框。它使事情变得更容易
  • @MKesper 但它不适用于 C++
  • 一个更简单的版本,如果没有 XML,也没有 HTML... ^(?([^\r\n])\s)*[^\s+?/]+[^\n]* $.
【解决方案6】:

找到这个提示: LOC with VS Find and replace

不是插件,但如果那是您正在寻找的东西。

【讨论】:

  • 我喜欢这个,但我想我在那里的表达中发现了一个小错误。对于 VB.Net,我认为应该是 ^~(:Wh@')~(:Wh@\#).+ 而对于 C#,我认为应该是 ^~(:Wh@//)~(:Wh@\{:Wh @)~(:Wh@\}:Wh@)~(:Wh@\#).+ 这样就可以正确处理空白注释行和编译器指令。无论如何,VB.NET 对我来说效果更好,而 C# 我还没有测试过。
  • ^~(:Wh@//)~(:Wh@\{:Wh@)~(:Wh@\}:Wh@)~(:Wh@\#)~(: Wh@$).+ 最终在 C# 上工作得更好,我得到了一些只包含空格的行。
  • 它不也计算所有注释行吗?请输入几行代码!
  • 这是我在 VS2012 中使用的一个板条箱(发布的那个在 2010 年已经过时)并且只计算代码行数。它排除了所有 cmets,使用指令、花括号、xml 指令、空行等......给你一个真正的代码只计数:^(?!(\s**))(?!(\s*\ -\-\>))(?!(\s*\
【解决方案7】:

现在它不会专门在 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 伯恩壳牌 116 3402 5789 36882 x 3.81 = 140520.42 Lisp 1 684 2242 7515 x 1.25 = 9393.75 使 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 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 -------------------------------------------------- -----------------------------------------

第三代等效规模是对third generation language 中需要多少代码的粗略估计。不是特别有用,但还是很有趣。

【讨论】:

  • 这很棒而且超级好用。比 Find/Replace 解决方案容易得多,并且比 VS Code Metrics 选项更清楚它实际在做什么。只需choco install cloc,然后在您的解决方案目录中添加cloc .。任务完成!
  • 我从 CLOC website 下载了 Windows EXE 并在我的 Visual Studio 2017 网站项目文件夹中运行它。像魅力一样工作。我喜欢 --by-file-by-lang 选项,它列出了每个文件和语言的行数,从大到小排序。
【解决方案8】:

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

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

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

然后选择“计算指标”

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

【讨论】:

  • Visual Studio 2010 也有这个指标。实际上 VS2012 并没有什么新东西。
  • 是的,但是这里的答案是从 vs 2008 年开始的,而且有点过时了,为什么要使用任何东西或安装一些扩展程序,因为它是一个内置功能。甚至这不是很多人都不知道的新功能。
  • @MikeChaliy 可能是第二个介绍句让你感到困惑,所以我稍微改写了一下以避免这种混乱。
  • 我有一个 n 层解决方案,但显示此错误:“调用目标已引发异常。”为什么?
  • 这不是代码行,而是编译行(即转化为IL之后)。我认为 Fermin 正在寻找预编译的行。
【解决方案9】:

正则表达式在 VS2010 和 2012 之间发生了变化,所以这里的大部分正则表达式解决方案不再起作用

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

将查找所有非空白行,不只是单个括号('{' 或 '}'),而不仅仅是 #include 或其他预处理器。

使用 Ctrl-shift-f 并确保启用正则表达式。

VS 2010 及更早版本对应的正则表达式为

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

【讨论】:

    【解决方案10】:

    在 Visual Studio Team System 2008 中,您可以从菜单“分析”->“计算解决方案的代码指标”中进行操作,它将为您提供整个解决方案的行数(除其他外 g )

    【讨论】:

    • Visual Studio Team System 2008 无法计算非托管代码。 ;)
    【解决方案11】:

    对于未来的读者,我想建议DPack extension for Visual Studio 2010

    它内置了大量实用程序,包括一个行计数器,它显示有多少行是空白的、代码等。

    【讨论】:

    【解决方案12】:

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

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

    当然这对于大型项目来说不是很好,因为所有行都经过处理并加载到内存中以在查找结果窗口中显示。

    参考:

    【讨论】:

      【解决方案13】:

      在 Visual Studio 2019 中,您需要从顶部菜单中选择:

      'Analyze' -> 'Calculate Code Metrics' -> 'For Solution'
      

      这适用于 Visual Studio 2019 Professional 和 Enterprise。

      【讨论】:

      • 不适用于 C/C++ 项目。仅适用于 C# 和 Visual Basic,它们不是网站项目或共享项目
      • 也可用或 Visual Studio 2019/2022 社区
      【解决方案14】:

      你可以使用:

      【讨论】:

        【解决方案15】:

        我更喜欢OxyProject Metrics VS Addin。

        【讨论】:

          【解决方案16】:

          显然工具更容易,但我觉得在 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}
          

          【讨论】:

            【解决方案17】:

            VS2008其他简单工具(开源):http://www.accendo.sk/Download/SourceStat.zip

            【讨论】:

              【解决方案18】:

              在 Visual Studio 2010 Ultimate 中使用菜单 -> 分析 -> 计算代码指标选项。

              【讨论】:

                【解决方案19】:

                您可以使用Visual Studio Code Metrics PowerTool 10.0。它是一个命令行实用程序,可为您计算托管代码的一些指标(包括代码行)。您可以获得一个brings the tool into Visual Studio 的VS 2010 插件,只需选择菜单项并单击“分析解决方案”即可。

                【讨论】:

                  【解决方案20】:

                  同意阿里·帕尔的观点。 WndTab 行计数器插件就是这样一个工具。 http://www.codeproject.com/KB/macros/linecount.aspx

                  从下载站点搜索以找到一些相关工具也是一个好主意。 http://www.cnet.com/1770-5_1-0.html?query=code+counter&tag=srch

                  【讨论】:

                    【解决方案21】:
                    【解决方案22】:

                    您可以使用免费工具SourceMonitor

                    提供了很多衡量标准:代码行数、语句数、复杂性、块深度

                    通过图表具有图形输出

                    【讨论】:

                      【解决方案23】:

                      您可以在 Visual Studio 2010 中使用 Project Line Counter 加载项。通常它不适用于 Visual Studio 2010,但它适用于此处的有用 .reg 文件:http://www.onemanmmo.com/index.php?cmd=newsitem&comment=news.1.41.0

                      【讨论】:

                        【解决方案24】:

                        我想出了一个快速而肮脏的 powershell 脚本,用于计算文件夹结构中的行数。它不像其他答案中引用的其他一些工具那样功能齐全,但我认为它足以提供一个项目或解决方案中代码文件相对于彼此的大小的粗略比较。

                        脚本可以在这里找到:

                        https://gist.github.com/1674457

                        【讨论】:

                          【解决方案25】:

                          试试海王星。除了 LoC 之外,它还为您提供空格、制表符、cmets 行等内容。 http://neptuner.googlecode.com/files/neptuner_0_30_windows.zip

                          【讨论】:

                            【解决方案26】:

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

                            【讨论】:

                              猜你喜欢
                              • 2011-04-25
                              • 1970-01-01
                              • 1970-01-01
                              • 2015-11-28
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 2011-01-03
                              • 1970-01-01
                              相关资源
                              最近更新 更多