DevEco Studio中怎么查看代码的总行数

DevEco Studio中怎么查看代码的总行数 DevEco中怎么查看代码的总行数, 查看一下代码总行数是多少。

6 回复

如果有python环境的话,可以使用下面的代码,保存到本地命名 code_counter.py。

python ./xxx/code_counter.py  ./xxxxxx/harmony-project

运行效果:

项目路径:./
排除目录:['node_modules', '.git', 'build', 'oh_modules', 'dist', 'output', 'logs', 'test', 'tests', '_tests', '.idea', '.vscode', '.gradle', '.hvigor']
统计语言:所有鸿蒙核心语言

================================================================================
鸿蒙(HarmonyOS)项目代码行数汇总
================================================================================
  json5     :      369 行 ( 13.7%)
  json      :       74 行 (  2.7%)
  TypeScript:       10 行 (  0.4%)
⭐ ArkTS     :    2,250 行 ( 83.2%)
--------------------------------------------------------------------------------
总计:             2,703 行 | 扫描文件数: 55 个
================================================================================

或者查看更详细的扫描信息,添加参数 --show-detail

python ./xxx/code_counter.py ./xxxx/harmony-project --show-detail

code_counter.py 源码:

import argparse
import os
from collections import defaultdict

# 鸿蒙项目代码行数统计工具
# ===================== 鸿蒙项目专属配置 =====================
HARMONY_EXTENSIONS = {
    'ArkTS': ['.ets'],          # 主力开发语言
    'JavaScript': ['.js', 'jsx'],  # 前端兼容
    'TypeScript': ['.ts', '.tsx'], # 前端兼容
    'CSS': ['.css', '.less'],   # 前端兼容
    'HTML': ['.html'],          # 前端兼容
    'C/C++': ['.c', '.cpp', '.h'], # 鸿蒙NDK开发
    'json': ['.json'],          # 鸿蒙配置文件(string.json)
    'json5': ['.json5'],        # 鸿蒙配置文件(build-profile.json5)
    'xml': ['.xml'],            # 鸿蒙资源配置
    'Dart': ['.dart'],          # Flutter兼容
}

# 鸿蒙项目默认排除的目录
HARMONY_DEFAULT_EXCLUDE = [
    'node_modules', '.git', 'build', 'oh_modules',
    'dist', 'output', 'logs', 'test', 'tests', '_tests',
    '.idea', '.vscode', '.gradle', '.hvigor'
]

# 反向映射:后缀 -> 鸿蒙语言/文件类型
HARMONY_EXT_TO_LANG = {}
for lang, exts in HARMONY_EXTENSIONS.items():
    for ext in exts:
        HARMONY_EXT_TO_LANG[ext.lower()] = lang

# ===================== 全局变量 =====================
# 格式:{文件路径: (语言, 行数)} - 仅--show-detail时填充
file_detail = {}
# 统计扫描的文件总数(无论是否--show-detail都统计)
file_count = 0

# ===================== 核心方法 =====================
def count_file_lines(file_path: str) -> int:
    """统计单个文件的非空行数(容错编码问题)"""
    try:
        with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:
            lines = [line for line in f.readlines() if line.strip()]
            return len(lines)
    except Exception as e:
        print(f"⚠️ 读取文件失败 {file_path}: {str(e)}")
        return 0

def count_harmony_project(project_path: str,
                          exclude_dirs: list = None,
                          include_langs: list = None,
                          show_detail: bool = False) -> tuple[dict, int, int]:
    """
    统计鸿蒙项目代码行数
    :param show_detail: 是否展示文件明细
    :return: (各语言行数字典, 总行数, 总文件数)
    """
    global file_detail, file_count
    file_detail.clear()  # 清空历史明细
    file_count = 0       # 重置文件数
    lang_lines = defaultdict(int)
    total_lines = 0

    # 合并排除目录
    final_exclude = HARMONY_DEFAULT_EXCLUDE.copy()
    if exclude_dirs:
        final_exclude.extend(exclude_dirs)
    exclude_abs = [os.path.abspath(os.path.join(project_path, d)) for d in final_exclude]

    # 仅在--show-detail时打印扫描提示
    if show_detail:
        print("\n开始扫描文件(鸿蒙项目):")
        print("-" * 80)

    for root, dirs, files in os.walk(project_path):
        # 过滤排除目录
        dirs[:] = [d for d in dirs if os.path.abspath(os.path.join(root, d)) not in exclude_abs]

        for file in files:
            file_ext = os.path.splitext(file)[1].lower()
            lang = HARMONY_EXT_TO_LANG.get(file_ext)

            # 过滤非鸿蒙文件/指定语言
            if not lang or (include_langs and lang not in include_langs):
                continue

            # 统计文件行数
            file_path = os.path.abspath(os.path.join(root, file))
            lines = count_file_lines(file_path)

            # 累加文件数(核心:无论是否show_detail都统计)
            file_count += 1

            # 仅在--show-detail时记录明细并实时打印
            if show_detail:
                # 记录文件明细:路径 -> (语言, 行数)
                file_detail[file_path] = (lang, lines)
                # 实时打印扫描到的文件+行数(相对路径更易读)
                rel_path = os.path.relpath(file_path, project_path)
                print(f"✅ {rel_path:<60} | {lang:<8} | {lines:>4} 行")

            # 累加语言行数和总行数(始终执行)
            lang_lines[lang] += lines
            total_lines += lines

    # 仅在--show-detail时打印扫描结束分隔线
    if show_detail:
        print("-" * 80)

    return dict(lang_lines), total_lines, file_count

def print_file_detail_summary():
    """打印文件明细汇总(可选:按语言分组)"""
    if not file_detail:
        return
    print("\n文件明细汇总(按语言分组):")
    print("-" * 80)
    # 按语言分组文件
    lang_files = defaultdict(list)
    for file_path, (lang, lines) in file_detail.items():
        lang_files[lang].append((file_path, lines))

    for lang, files in lang_files.items():
        print(f"\n【{lang}】共 {len(files)} 个文件:")
        for file_path, lines in files:
            rel_path = os.path.relpath(file_path, os.getcwd())
            print(f"  {rel_path:<60} | {lines:>4} 行")

def print_harmony_stats(lang_lines: dict, total_lines: int, file_count: int):
    """打印鸿蒙项目统计汇总(含占比+文件数)"""
    if total_lines == 0:
        print("\n未统计到鸿蒙项目相关代码")
        return

    print("\n" + "="*80)
    print("鸿蒙(HarmonyOS)项目代码行数汇总")
    print("="*80)
    # 按行数降序,ArkTS优先
    sorted_langs = sorted(lang_lines.items(),
                          key=lambda x: (x[0] != 'ArkTS', x[1]),
                          reverse=True)

    for lang, lines in sorted_langs:
        ratio = (lines / total_lines) * 100
        prefix = "⭐ " if lang == 'ArkTS' else "  "
        print(f"{prefix}{lang:<10}: {lines:>8,} 行 ({ratio:>5.1f}%)")

    print("-"*80)
    # 始终显示扫描文件数(核心修改点)
    print(f"总计:          {total_lines:>8,} 行 | 扫描文件数: {file_count} 个")
    print("="*80)

# ===================== 命令行入口 =====================
def main():
    parser = argparse.ArgumentParser(description='📱 鸿蒙项目代码行数统计工具(含文件明细)')
    parser.add_argument('project_path', help='鸿蒙项目根目录(如 ./my_harmony_app)')
    parser.add_argument('--exclude', nargs='*', default=[],
                        help='额外排除的目录(如 --exclude temp docs)')
    parser.add_argument('--include', nargs='*', default=[],
                        help='仅统计的鸿蒙语言(如 --include ArkTS Java)')
    parser.add_argument('--show-detail', action='store_true',
                        help='是否打印每个文件的详细行数(默认不打印)')

    args = parser.parse_args()

    # 验证路径
    if not os.path.isdir(args.project_path):
        print(f"错误:鸿蒙项目路径 {args.project_path} 不存在")
        return

    # 执行统计
    print(f"项目路径:{args.project_path}")
    print(f"排除目录:{HARMONY_DEFAULT_EXCLUDE + args.exclude}")
    print(f"统计语言:{args.include if args.include else '所有鸿蒙核心语言'}")

    # 接收返回的文件数(核心修改点)
    lang_lines, total_lines, file_count = count_harmony_project(
        project_path=args.project_path,
        exclude_dirs=args.exclude,
        include_langs=args.include,
        show_detail=args.show_detail
    )

    # 打印按语言分组的明细(仅在--show-detail时执行)
    if args.show_detail:
        print_file_detail_summary()

    # 传递文件数到汇总打印函数
    print_harmony_stats(lang_lines, total_lines, file_count)

if __name__ == '__main__':
    main()

在DevEco Studio中,可以通过内置的统计功能查看代码总行数。使用快捷键 Ctrl+Shift+A(Windows/Linux)或 Cmd+Shift+A(macOS),搜索并打开“Statistic”工具。该工具会显示项目或选定目录的代码行数统计,包括总行数、源代码行数等详细信息。

在DevEco Studio中,可以通过以下两种主要方法快速查看项目的代码总行数:

  1. 使用内置的统计功能(推荐)

    • 在项目根目录上右键单击。
    • 选择“Find in Files”(或使用快捷键 Ctrl+Shift+F)。
    • 在搜索框中输入正则表达式:^\s*$,并勾选“Regular expression”。
    • 将搜索范围设置为整个项目,然后执行搜索。
    • 搜索结果会显示匹配的行数(即非空行),但更直接的方法是:
      • 右键点击项目根目录 → “Local History” → “Show History” → 切换到“Statistics”选项卡,这里会显示文件数、总行数等信息。
  2. 通过终端命令统计

    • 打开DevEco Studio内置终端(Terminal)。
    • 输入以下命令(适用于HarmonyOS项目常见的文件类型):
      find . -name "*.ets" -o -name "*.ts" -o -name "*.js" -o -name "*.json" | xargs wc -l
      
    • 命令会列出每种文件的代码行数,并显示总行数。

注意:统计结果通常包含空行和注释行,若需精确统计有效代码行数,可借助第三方插件或脚本进行过滤。

回到顶部