目录
- 工具简介
- 核心特性
- 核心用途与场景
- 常见报错与解决方案
- [适配开源鸿蒙 PC 端的要点](#适配开源鸿蒙 PC 端的要点)
- 鸿蒙适配中的报错解决过程
- 构建脚本详解
- [HNP 包配置](#HNP 包配置)
- 构建结果
- 仓库地址与安装方式
- 总结
- FAQ
- 相关链接
工具简介
tokei(日语:時計,意为"时钟")是一个用 Rust 开发的命令行工具,用于快速统计代码行数。它可以显示项目中每种编程语言的文件数量、总行数、代码行数、注释行数和空白行数。
什么是 tokei?
tokei 是一个代码统计工具,类似于 cloc(Count Lines of Code),但速度更快、功能更强大。它能够:
- 快速统计:在几秒钟内统计数百万行代码
- 准确识别:正确识别 150+ 种编程语言及其扩展名
- 智能分析:正确处理多行注释、嵌套注释和字符串中的注释
- 多格式输出:支持 JSON、YAML、CBOR 等多种输出格式
先看编译成功的效果图

核心特性
-
极速性能:
- 使用 Rust 编写,性能接近 C/C++
- 多线程并行处理,充分利用多核 CPU
- 能够快速处理大型代码库
-
准确性:
- 正确处理多行注释
- 识别嵌套注释
- 不将字符串中的注释计入统计
- 提供准确的代码统计信息
-
语言支持广泛:
- 支持超过 150 种编程语言
- 支持各种文件扩展名
- 自动识别语言类型
-
多种输出格式:
- 默认表格格式(美观易读)
- JSON 格式(便于脚本处理)
- YAML 格式(便于配置)
- CBOR 格式(二进制格式)
-
跨平台支持:
- 支持 macOS、Linux、Windows
- 单一可执行文件,零运行时依赖
- 无需额外配置即可使用
-
库支持:
- 可以作为库集成到其他项目中
- 提供完整的 API 文档
开发语言与设计优势
Rust 语言的优势:
- 性能:编译后的二进制文件运行速度快,内存占用低
- 安全性:内存安全保证,避免常见的内存错误
- 并发性:原生支持多线程,充分利用多核 CPU
- 可移植性:单一可执行文件,易于分发和部署
设计优势:
- 零依赖:编译后是单个可执行文件,不需要额外的库
- 快速启动:启动速度快,适合频繁使用
- 资源占用低:内存和 CPU 占用小
- 易于集成:可以轻松集成到 CI/CD 流程中
核心用途与场景
基本用法
1. 统计当前目录
bash
# 统计当前目录及其子目录
tokei
# 统计指定目录
tokei /path/to/project
# 统计多个目录
tokei ./src ./tests ./examples
2. 输出格式选择
bash
# 默认表格格式
tokei
# JSON 格式(便于脚本处理)
tokei --output json
# YAML 格式
tokei --output yaml
# CBOR 格式(二进制)
tokei --output cbor
3. 排序和筛选
bash
# 按代码行数排序
tokei --sort code
# 按文件数量排序
tokei --sort files
# 只显示特定语言
tokei --type Rust
# 排除特定文件
tokei --exclude "*.lock"
tokei --exclude "target/"
4. 显示文件详情
bash
# 显示每个文件的统计信息
tokei --files
# 显示文件路径
tokei --files --verbose
实际应用场景
场景 1:项目代码统计
bash
# 统计整个项目的代码
tokei
# 输出示例:
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# Language Files Lines Code Comments Blanks
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# Rust 19 3416 2840 116 460
# Markdown 5 1355 0 1074 281
# TOML 2 77 64 4 9
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# Total 26 4848 2904 1194 750
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
场景 2:CI/CD 集成
bash
# 在 CI 中生成代码统计报告
tokei --output json > code_stats.json
# 检查代码行数是否超过阈值
tokei --type Rust | grep -E "Total|Rust" | awk '{if ($3 > 10000) exit 1}'
场景 3:项目对比
bash
# 统计不同版本的代码量
tokei --output json > v1.0_stats.json
# 切换到新版本
tokei --output json > v2.0_stats.json
# 对比两个版本
diff v1.0_stats.json v2.0_stats.json
场景 4:代码质量监控
bash
# 检查注释率
tokei --type Rust | awk '/Rust/ {if ($5/$3 < 0.1) print "Warning: Low comment ratio"}'
# 检查空白行比例
tokei --type Rust | awk '/Rust/ {if ($6/$3 > 0.3) print "Warning: High blank line ratio"}'
场景 5:文档生成
bash
# 生成代码统计报告
tokei --output json | jq '.' > code_report.json
# 生成 Markdown 报告
tokei --output json | jq -r '
"## Code Statistics\n",
"| Language | Files | Lines | Code | Comments | Blanks |\n",
"|----------|-------|-------|------|----------|--------|\n",
(.languages | to_entries[] |
"| \(.key) | \(.value.stats.files) | \(.value.stats.lines) | \(.value.stats.code) | \(.value.stats.comments) | \(.value.stats.blanks) |\n"
)
' > code_stats.md
高级用法
1. 配置文件
创建 tokei.toml 或 .tokeirc 文件:
toml
# 排除特定路径
exclude = [
"target/",
"*.lock",
"node_modules/",
]
# 自定义语言类型
[[languages]]
name = "Custom"
extensions = ["custom"]
# 输出格式
output = "json"
2. 配合其他工具
bash
# 配合 jq 处理 JSON 输出
tokei --output json | jq '.languages.Rust.stats.code'
# 配合 grep 筛选
tokei --files | grep "\.rs$"
# 配合 awk 计算
tokei | awk '/Total/ {print "Total code lines:", $3}'
常见报错与解决方案
问题 1:安装失败
错误信息:
error: failed to compile `tokei`
error: could not find crate for `std`
原因:Rust 工具链未正确安装或版本过旧。
解决方案:
bash
# 安装 Rust(如果未安装)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# 更新 Rust 工具链
rustup update stable
# 验证安装
rustc --version
cargo --version
# 安装 tokei
cargo install tokei
问题 2:运行时权限错误
错误信息:
Permission denied: /path/to/directory
原因:没有读取目录的权限。
解决方案:
bash
# 检查目录权限
ls -ld /path/to/directory
# 使用 sudo(如果需要)
sudo tokei /path/to/directory
# 或者修改目录权限(谨慎使用)
chmod +r /path/to/directory
问题 3:目录路径解析异常
错误信息:
No such file or directory: /path/to/directory
原因:路径不存在或路径格式错误。
解决方案:
bash
# 检查路径是否存在
ls -la /path/to/directory
# 使用绝对路径
tokei /home/user/project
# 使用相对路径
cd /home/user/project
tokei .
问题 4:输出格式错误
错误信息:
error: invalid value 'xml' for '--output <FORMAT>'
原因:使用了不支持的输出格式。
解决方案:
bash
# 查看支持的输出格式
tokei --help | grep -A 5 "output"
# 使用支持的格式
tokei --output json
tokei --output yaml
tokei --output cbor
问题 5:内存不足
错误信息:
thread 'main' panicked at 'out of memory'
原因:处理超大代码库时内存不足。
解决方案:
bash
# 限制处理的目录深度
tokei --exclude "node_modules/" --exclude "target/"
# 分批处理
tokei src/ > src_stats.txt
tokei tests/ > tests_stats.txt
# 使用更少的线程(如果支持)
# 注意:tokei 可能没有直接控制线程数的选项,但可以通过排除大目录来减少内存使用
问题 6:语言识别错误
错误信息:某些文件被错误识别为其他语言。
原因:文件扩展名不在 tokei 的语言数据库中。
解决方案:
bash
# 查看支持的语言
tokei --help | grep -A 50 "Supported languages"
# 使用配置文件指定语言类型
# 在 tokei.toml 中添加:
[[languages]]
name = "Custom"
extensions = ["custom"]
适配开源鸿蒙 PC 端的要点
系统环境差异
1. 包管理器
HarmonyOS PC 使用 HNP(HarmonyOS Native Package)作为包管理格式,而不是传统的 apt、yum 或 brew。
影响:
- 需要创建 HNP 包配置文件(
hnp.json) - 安装路径遵循 HNP 规范
- 包管理命令不同
2. 依赖库
HarmonyOS 使用 musl libc 而不是 glibc,这影响:
- 链接方式:需要使用静态链接或 musl 兼容的动态链接
- 系统调用:某些系统调用可能不同
- 库依赖:需要确保所有依赖都支持 musl
3. 终端交互兼容性
HarmonyOS 终端可能使用不同的:
- 颜色支持:需要测试颜色输出兼容性
- 字符编码:确保 UTF-8 支持
- 终端特性:某些高级特性可能需要适配
Rust 工具链在鸿蒙上的编译适配
1. 目标平台选择
HarmonyOS 使用 aarch64-unknown-linux-musl 作为目标平台:
bash
export TARGET=aarch64-unknown-linux-musl
原因:
- HarmonyOS 基于 Linux 内核
- 使用 musl libc 而不是 glibc
- 架构是 aarch64(ARM 64位)
2. 交叉编译配置
需要配置 Rust 工具链使用 HarmonyOS SDK:
bash
# 设置工具链环境变量
export CC_aarch64_unknown_linux_musl=${CC}
export CXX_aarch64_unknown_linux_musl=${CXX}
export AR_aarch64_unknown_linux_musl=${AR}
export RANLIB_aarch64_unknown_linux_musl=${RANLIB}
export STRIP_aarch64_unknown_linux_musl=${STRIP}
3. 链接器配置
需要配置 .cargo/config.toml 使用 HarmonyOS 的链接器:
toml
[target.aarch64-unknown-linux-musl]
linker = "clang"
rustflags = [
"-C", "link-arg=--target=aarch64-linux-ohos",
"-C", "link-arg=--sysroot=${SDK_PATH}/native/sysroot",
"-C", "link-arg=-fuse-ld=lld",
"-C", "link-arg=--ld-path=${SDK_PATH}/native/llvm/bin/ld.lld",
]
关键适配要点总结
- 目标平台 :使用
aarch64-unknown-linux-musl - 链接器:使用 HarmonyOS SDK 的 LLD
- 系统根目录:指定 HarmonyOS SDK 的 sysroot
- 包格式:使用 HNP 格式打包
- 安装路径:遵循 HNP 规范
鸿蒙适配中的报错解决过程
报错 1:构建系统识别错误
错误信息:
make: *** No rule to make target `clean'. Stop.
make: *** No targets specified and no makefile found. Stop.
原因分析 :
tokei 是一个 Rust 项目,使用 Cargo 作为构建系统,而不是 Makefile。原始的构建脚本错误地使用了 make 命令。
解决过程:
-
识别构建系统:
bashls -la # 发现 Cargo.toml,确认是 Rust 项目 -
修改构建脚本:
- 移除
make clean、make VERBOSE=1、make install命令 - 改用
cargo build --release --target ${TARGET}
- 移除
-
配置交叉编译:
- 设置目标平台为
aarch64-unknown-linux-musl - 配置工具链环境变量
- 创建
.cargo/config.toml
- 设置目标平台为
最终解决方案:
bash
# 使用 Cargo 构建
cargo build --release --target aarch64-unknown-linux-musl
报错 2:链接器选项不兼容
错误信息:
ld: unknown option: --as-needed
clang-15: error: linker command failed with exit code 1
原因分析 :
Rust 默认会添加 -Wl,--as-needed 链接器选项,但 HarmonyOS SDK 使用的 LLD 链接器不支持这个选项。
排查思路:
-
检查链接器类型:
bashfile ${SDK_PATH}/native/llvm/bin/ld.lld # 确认是 LLD 链接器 -
查看 Rust 传递的参数:
bashcargo build --release --target ${TARGET} --verbose 2>&1 | grep "link-arg" # 发现 -Wl,--as-needed 选项 -
尝试禁用选项:
- 在
rustflags中添加-Wl,--no-as-needed(无效) - Rust 仍然会添加
--as-needed
- 在
解决方案:
创建链接器包装脚本,过滤掉不支持的选项:
bash
# 创建链接器包装脚本
LINKER_WRAPPER=$(mktemp)
cat > "${LINKER_WRAPPER}" << 'EOF'
#!/bin/bash
ARGS=()
for arg in "$@"; do
case "$arg" in
*--as-needed*)
# 跳过不支持的选项
;;
*)
ARGS+=("$arg")
;;
esac
done
exec "${CC}" "${ARGS[@]}"
EOF
chmod +x "${LINKER_WRAPPER}"
# 在 .cargo/config.toml 中使用包装脚本
linker = "${LINKER_WRAPPER}"
关键代码:
bash
# 过滤掉 --as-needed 相关选项
case "$arg" in
*--as-needed*)
# 跳过
;;
-Wl,--as-needed)
# 跳过
;;
-Wl,--no-as-needed)
# 也跳过(LLD 不支持)
;;
*)
ARGS+=("$arg")
;;
esac
报错 3:安装目录不存在
错误信息:
cp: directory /Users/jianguo/HarmonyOSPC/build/data/service/hnp//tokei.org/tokei_13.0.1 does not exist
Error: Failed to copy hnp.json
原因分析 :
安装目录不存在,需要先创建。
解决方案:
bash
# 创建安装目录
mkdir -p ${TREE_INSTALL_HNP_PATH}/usr/bin
mkdir -p ${TREE_INSTALL_HNP_PATH}/usr/share/man/man1
报错 4:目标平台配置错误
错误信息:
error[E0463]: can't find crate for `std`
= note: the `aarch64-apple-darwin` target may not be installed
原因分析 :
Rust 尝试为当前主机平台(macOS)编译,而不是为目标平台(HarmonyOS)编译。
解决过程:
-
检查目标平台:
bashrustup target list | grep aarch64 # 确认 aarch64-unknown-linux-musl 存在 -
安装目标平台:
bashrustup target add aarch64-unknown-linux-musl -
确保使用正确的目标:
bashcargo build --release --target aarch64-unknown-linux-musl
最终解决方案:
bash
export TARGET=aarch64-unknown-linux-musl
cargo build --release --target ${TARGET}
适配过程中的关键决策
- 使用链接器包装脚本:解决 LLD 不支持的选项问题
- 静态链接优先:减少运行时依赖
- 遵循 HNP 规范:确保包格式正确
- 错误处理完善:添加详细的错误检查和提示
构建脚本详解
build_ohos.sh 完整代码
bash
export TREE_INSTALL_HNP_PATH=${HNP_PUBLIC_PATH}/tokei.org/tokei_13.0.1
# 创建安装目录
mkdir -p ${TREE_INSTALL_HNP_PATH}/usr/bin
mkdir -p ${TREE_INSTALL_HNP_PATH}/usr/share/man/man1
# 设置 Rust 交叉编译目标
export CARGO_TARGET_DIR=${PWD}/target
export TARGET=aarch64-unknown-linux-musl
# 配置 cargo 使用 HarmonyOS 工具链
export CC_aarch64_unknown_linux_musl=${CC}
export CXX_aarch64_unknown_linux_musl=${CXX}
export AR_aarch64_unknown_linux_musl=${AR}
export RANLIB_aarch64_unknown_linux_musl=${RANLIB}
export STRIP_aarch64_unknown_linux_musl=${STRIP}
# 设置链接器
export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_LINKER=${CC}
# 创建 .cargo 配置目录
mkdir -p .cargo
# 创建链接器包装脚本
LINKER_WRAPPER=$(mktemp)
cat > "${LINKER_WRAPPER}" << LINKER_EOF
#!/bin/bash
ARGS=()
for arg in "\$@"; do
case "\$arg" in
*--as-needed*)
;;
-Wl,--as-needed)
;;
-Wl,--no-as-needed)
;;
*)
ARGS+=("\$arg")
;;
esac
done
exec "${CC}" "\${ARGS[@]}"
LINKER_EOF
chmod +x "${LINKER_WRAPPER}"
# 动态生成 .cargo/config.toml
SDK_PATH=${OHOS_SDK:-/Users/jianguo/Desktop/ohosdk}
cat > .cargo/config.toml << EOF
[target.aarch64-unknown-linux-musl]
linker = "${LINKER_WRAPPER}"
rustflags = [
"-C", "link-arg=--target=aarch64-linux-ohos",
"-C", "link-arg=--sysroot=${SDK_PATH}/native/sysroot",
"-C", "link-arg=-fuse-ld=lld",
"-C", "link-arg=--ld-path=${SDK_PATH}/native/llvm/bin/ld.lld",
]
EOF
# 构建 release 版本
cargo build --release --target ${TARGET} --verbose
# 安装二进制文件
cp ${CARGO_TARGET_DIR}/${TARGET}/release/tokei ${TREE_INSTALL_HNP_PATH}/usr/bin/tokei
chmod +x ${TREE_INSTALL_HNP_PATH}/usr/bin/tokei
# 复制 man pages(如果存在)
if [ -f manual/tokei.1 ]; then
cp manual/tokei.1 ${TREE_INSTALL_HNP_PATH}/usr/share/man/man1/
fi
# 复制 hnp.json 并打包
cp hnp.json ${TREE_INSTALL_HNP_PATH}/
pushd ${TREE_INSTALL_HNP_PATH}/../
${HNP_TOOL} pack -i ${TREE_INSTALL_HNP_PATH} -o ${ARCHIVE_PATH}/
tar -zvcf ${ARCHIVE_PATH}/ohos_tokei_13.0.1.tar.gz tokei_13.0.1/
popd
脚本关键点解析
1. 链接器包装脚本
作用 :过滤掉 LLD 不支持的 --as-needed 选项。
实现:
- 遍历所有链接器参数
- 过滤掉包含
--as-needed的参数 - 将剩余参数传递给实际链接器
2. Cargo 配置
.cargo/config.toml:
- 指定链接器为包装脚本
- 配置 HarmonyOS SDK 路径
- 设置链接器参数
3. 构建流程
- 清理 :
cargo clean - 构建 :
cargo build --release --target ${TARGET} - 安装:复制二进制文件和文档
- 打包:创建 HNP 包和 tar 归档
HNP 包配置
hnp.json
json
{
"type": "hnp-config",
"name": "tokei",
"version": "13.0.1",
"install": {}
}
安装目录结构
tokei_13.0.1/
├── usr/
│ ├── bin/
│ │ └── tokei # 可执行文件
│ └── share/
│ └── man/
│ └── man1/
│ └── tokei.1 # 用户手册(如果存在)
└── hnp.json # HNP 包配置
构建结果
构建成功后,会生成以下文件:
-
HNP 包 :
tokei.org_tokei_13.0.1.hnp- HarmonyOS 原生包格式
- 可以直接安装到 HarmonyOS 设备
-
Tar 归档 :
ohos_tokei_13.0.1.tar.gz- 压缩的 tar 归档
- 包含完整的安装目录结构
构建输出示例
==========================================
Build completed successfully!
==========================================
HNP Package: /path/to/archive/tokei.org_tokei_13.0.1.hnp
Tar Archive: /path/to/archive/ohos_tokei_13.0.1.tar.gz
Installation Path: /path/to/data/service/hnp/tokei.org/tokei_13.0.1
==========================================
仓库地址与安装方式
仓库地址
HarmonyOS 适配版本:
- 仓库:https://gitcode.com/nutpi/tokei
- Tag :
13.0.1_ohos - 原始项目:https://github.com/XAMPPRocky/tokei
安装方式
Linux(通用)
使用 Cargo:
bash
cargo install tokei
使用包管理器:
bash
# Arch Linux
sudo pacman -S tokei
# Fedora
sudo dnf install tokei
# Alpine Linux
apk add tokei
# Debian/Ubuntu(如果可用)
sudo apt install tokei
从源码编译:
bash
git clone https://github.com/XAMPPRocky/tokei.git
cd tokei
cargo build --release
sudo cp target/release/tokei /usr/local/bin/
macOS
使用 Homebrew:
bash
brew install tokei
使用 MacPorts:
bash
sudo port install tokei
使用 Cargo:
bash
cargo install tokei
Windows
使用 Winget:
bash
winget install XAMPPRocky.tokei
使用 Scoop:
bash
scoop install tokei
使用 Cargo:
bash
cargo install tokei
开源鸿蒙 PC
使用 HNP 包:
bash
# 安装 HNP 包
hnp install tokei.org_tokei_13.0.1.hnp
# 或使用 tar 归档
tar -xzf ohos_tokei_13.0.1.tar.gz
# 手动复制到系统路径
从源码交叉编译:
bash
# 1. 克隆仓库
git clone https://gitcode.com/nutpi/tokei.git
cd tokei
git checkout 13.0.1_ohos
# 2. 设置 HarmonyOS SDK 路径
export OHOS_SDK=/path/to/ohosdk
# 3. 运行构建脚本
./build_ohos.sh
# 4. 安装生成的 HNP 包
hnp install tokei.org_tokei_13.0.1.hnp
验证安装
bash
# 检查版本
tokei --version
# 测试基本功能
tokei
# 查看帮助
tokei --help
总结
适配要点
- 构建系统识别:Rust 项目使用 Cargo,不是 Makefile
- 目标平台选择 :使用
aarch64-unknown-linux-musl - 链接器兼容性:使用包装脚本过滤不支持的选项
- 工具链配置:正确配置交叉编译环境变量
- 包格式:遵循 HNP 规范
关键决策
- 链接器包装脚本:解决 LLD 不支持的选项问题
- 动态配置生成 :根据 SDK 路径生成
.cargo/config.toml - 错误处理:添加详细的错误检查和提示
优势
- 零运行时依赖:单一可执行文件,部署简单
- 高性能:Rust 编译,运行速度快
- 功能强大:支持 150+ 种编程语言
- 易于集成:可以轻松集成到 CI/CD 流程中
适用场景
- 代码统计和分析
- 项目文档生成
- CI/CD 集成
- 代码质量监控
- 项目对比分析
FAQ
Q1: tokei 和 cloc 有什么区别?
A: tokei 是 cloc 的现代化替代品,主要区别:
- tokei 速度更快(Rust 编写)
- tokei 支持更多语言(150+)
- tokei 输出格式更多(JSON、YAML、CBOR)
- tokei 可以作为库使用
- tokei 单一二进制文件,无需依赖
Q2: 为什么选择 Rust 开发?
A: Rust 的优势:
- 内存安全,避免常见错误
- 性能接近 C/C++
- 单一可执行文件,易于分发
- 跨平台支持好
- 现代语言特性丰富
Q3: 如何提高统计速度?
A:
- 排除不需要的目录(
--exclude) - 使用多线程(默认启用)
- 只统计特定语言(
--type) - 限制目录深度
Q4: 如何在 HarmonyOS 上使用 tokei?
A:
- 安装 HNP 包:
hnp install tokei.org_tokei_13.0.1.hnp - 或从源码交叉编译
- 使用方式与 Linux 相同
Q5: 链接器包装脚本是必需的吗?
A: 是的,因为:
- HarmonyOS SDK 使用 LLD 链接器
- LLD 不支持
--as-needed选项 - Rust 默认会添加这个选项
- 包装脚本可以过滤掉不支持的选项
Q6: 如何自定义输出格式?
A:
bash
# JSON 格式
tokei --output json
# YAML 格式
tokei --output yaml
# CBOR 格式
tokei --output cbor
Q7: 可以只统计特定语言吗?
A: 可以:
bash
# 只统计 Rust
tokei --type Rust
# 只统计多种语言
tokei --type Rust --type Python
Q8: JSON 输出格式是什么?
A: JSON 输出是一个对象,包含:
languages: 各语言的统计信息total: 总计信息- 每个语言包含:
files、lines、code、comments、blanks
相关链接
- tokei 官方网站:https://tokei.rs
- tokei GitHub 仓库:https://github.com/XAMPPRocky/tokei
- HarmonyOS 适配仓库:https://gitcode.com/nutpi/tokei
- Rust 官方网站:https://www.rust-lang.org/
- HarmonyOS 开发者文档:https://developer.harmonyos.com/
- Cargo 文档:https://doc.rust-lang.org/cargo/
- tokei API 文档:https://docs.rs/tokei/
- PC代码仓
- PC社区