Simian需通过Homebrew/apt/Scoop或手动下载JAR安装,运行时推荐配置simian.json指定文件路径、排除目录、阈值70及忽略空白符与标识符,并用-maxfilesize防内存溢出;结果可用VSCode快速跳转比对合并。

Simian命令行工具怎么装和跑起来
Simian(Similarity Analyser)是少数能跨文件、跨语言识别逻辑重复的CLI工具,不依赖VSCode插件,直接读源码做词法归一化。它比CodeMirror Duplicate Finder更“狠”:能把for (let i = 0; i 和<code>for (const item of arr)都识别为同一类遍历结构,前提是启用了-includesubtypes和-ignorewhitespace。
安装方式取决于你用的包管理器:
- macOS(Homebrew):
brew install simian - Linux(Debian/Ubuntu):
sudo apt install simian - Windows(Scoop):
scoop install simian - 通用(手动下载):去simian官网下最新
simian-x.x.x.jar,用java -jar simian-x.x.x.jar运行
首次运行建议加-threshold=70(默认80),否则小函数或钩子逻辑容易被漏掉;同时加上-ignorewhitespace -ignoreidentifiers,让变量名、空格、缩进差异不干扰判断。
怎么写simian.json配置避免漏扫
直接命令行跑容易丢文件类型或跳过目录,推荐用simian.json统一控制。它不是JSON Schema校验型配置,而是Simian能识别的键值对集合。
关键配置项必须显式声明:
-
"files": ["src/**/*.js", "src/**/*.ts", "src/**/*.jsx"]—— 别信glob通配符自动递归,Simian默认不展开**,得写全路径模式 -
"excludes": ["**/node_modules/**", "**/dist/**", "**/__tests__/**"]—— 这里必须用双星号,单*不生效 -
"threshold": 70—— 低于70会把大量噪声当重复,高于85又太保守 -
"ignoreWhitespace": true和"ignoreIdentifiers": true—— 这两项不加,payload和data会被当成完全不同逻辑
配置好后,在项目根目录执行:simian -config=simian.json。输出是纯文本,按重复块分组,每组末尾带文件路径+行号,点进去就能改。
Simian报错“Extension host terminated unexpectedly”怎么办
这不是VSCode问题,是Simian本身内存爆了。它加载所有匹配文件到内存做比对,遇到万行级JSX或超长模板字符串时,Java堆很容易OOM。
临时解法只有两个:
- 加
-maxfilesize=1024(单位KB),跳过大于1MB的单个文件,比如打包后的bundle.js - 拆成多次扫描:
simian src/utils/**/*.js、simian src/components/**/*.jsx分开跑,别一把梭
别指望它处理node_modules里的重复——那不是你的代码,也不该由你修。重点盯src和lib目录就行。
结果出来后怎么快速定位和合并
Simian输出里每段重复块开头都有类似Found 3 duplicate blocks:,后面跟着三组File: xxx.ts, Line: 42。这时候别手动打开每个文件,用VSCode原生功能提速:
- 复制整段路径+行号,比如
src/api/user.ts:42,粘贴到VSCode地址栏(Ctrl+P),回车直接跳转 - 三处都打开后,用
Ctrl+Shift+P → “Compare Active File With…”两两比对,看哪些行真能抽成公共函数 - 合并时别硬Ctrl+J——它会吃掉换行和缩进。先选中要合并的逻辑块,再用
Shift+Alt+F格式化,确保逗号、括号、缩进对齐后再剪切粘贴
最常被忽略的一点:Simian标出的重复,未必真该合并。比如两处都调了localStorage.setItem,但一处存用户token,一处存主题偏好,业务语义完全不同。工具只管“长得像”,你得判断“是不是一回事”。











