
代码质量有很多指标:
我做了一个脚本可以测出上面的 1, 2, 3
大家都来试一试吧!
npm install -g cqc cqc [options] <pattern ...> Examples:
cqc src/**/*.js Output:
Number of files: 8 Souce lines of code: 357 Duplicate rate: 5.62% Max complexity: 15 Complexity > 5 (count): 3 Complexity > 10 (count): 1 Complexity > 20 (count): 0 cqc src/**/*.js src/**/*.jsx --ignore-patterncqc src/**/*.js --ignore-pattern src/vendor/**/*.js cqc src/**/*.js --ignore-pattern src/vendor/**/*.js,src/third-party/**/*.js --ignore-filecqc src/**/*.js --ignore-file .gitignore cqc src/**/*.js --ignore-file .gitignore,.eslintignore --formatcqc src/**/*.js --format json Output:
{ "numberOfFiles": 8, "sloc": { "source": 357 }, "jscpd": { "percentage": "5.62" }, "complexity": { "max": 15, "gt5Count": 3, "gt10Count": 1, "gt20Count": 0 } } 文档写错了,--ignore-file 应该是 --ignore-path
另外还有一个参数是 --verbose 可以打印出更多信息
更新输出格式为:
Number of files: 9 Source lines of code: 463 Duplicate rate: 15.71% High complexity rate: 11.11% Max complexity: 19 增加 --complexity-threshold 参数,默认为 10
1 xcatliu OP 先来贴一个我们团队的项目的: Number of files: 997 Souce lines of code: 94524 Duplicate rate: 12.17% Max complexity: 89 Complexity > 5 (count): 292 Complexity > 10 (count): 76 Complexity > 20 (count): 17 重复代码率有点高,一般在 5% 以内比较正常。 最大圈复杂度有点太大了。。。 |
2 iluhcm 2017-09-20 18:50:16 +08:00 试了一下,Mac 运行报错。 env: node\r: No such file or directory Node:v8.1.3 |
3 xcatliu OP |
4 siteshen 2017-09-20 19:10:35 +08:00 看标题还以为支持所有语言,结果打开 GitHub 才发现只支持前端的内容。 发在“程序员”节点,希望标题里有“前端”、“ Javascript ” 之类的字样。 |
5 xcatliu OP @siteshen 因为 complexity 是用 eslint 实现的,所以暂不支持其他语言的 complexity。重复度检查是给予 jscpd 的,所以支持很多语言。 |
6 spring5413 2017-09-20 19:31:47 +08:00 请问大神,这个检查重复原理是什么 |
7 vardarling 2017-09-20 19:46:33 +08:00 "Souce lines of code" bug +1 |
8 xcatliu OP @vardarling lines of source code |
9 xcatliu OP @vardarling 第一次还没看出来,原来是少了个 r |
10 xcatliu OP @vardarling 已修复,谢谢反馈 |
12 vardarling 2017-09-20 20:06:15 +08:00 @xcatliu 第一次发现我眼睛这么好 |
13 zhlssg 2017-09-20 20:53:02 +08:00 via iPhone 这个有点厉害 |
14 mhycy 2017-09-20 22:05:49 +08:00 “您的代码质量分已超过 90%程序员,点击按钮一键优化” |
16 AlloVince 2017-09-20 22:23:50 +08:00 Number of files: 342 Source lines of code: 38967 Duplicate rate: 3.29% Max complexity: 27 Complexity > 5 (count): 73 Complexity > 10 (count): 18 Complexity > 20 (count): 2 |
18 AlloVince 2017-09-20 22:56:40 +08:00 @xcatliu 不知道源代码里一些 ES 的语法是怎么处理的,扫描的源码里使用了 decorators,object rest spread 等一些需要 babel 的语法 |
19 binux 2017-09-20 23:12:50 +08:00 Number of files: 95 Source lines of code: 6233 Duplicate rate: 0.19% Max complexity: 45 Complexity > 5 (count): 18 Complexity > 10 (count): 6 Complexity > 20 (count): 3 |
20 momocraft 2017-09-20 23:17:00 +08:00 cqc... 这名字怎么这么谐 |
21 Sapp 2017-09-20 23:42:36 +08:00 Number of files: 1 Souce lines of code: 57915 Duplicate rate: 6.95% Max complexity: 72 Complexity > 5 (count): 1 Complexity > 10 (count): 1 Complexity > 20 (count): 1 测了一下打包后的。 |
22 orange666 2017-09-21 08:45:04 +08:00 新手一枚,看到就试试,怎么用的这玩意。 |
23 imlinhanchao 2017-09-21 09:02:46 +08:00 记得 Coding 自带这个功能,而且不仅支持前端代码。 @Bazingawang |
24 iugo 2017-09-21 09:18:04 +08:00 不知道 pattern 该怎么写. `cqc src/**/*.js src/**/*.jsx` 却只找到一个 jsx 文件... |
25 polun 2017-09-21 09:18:16 +08:00 报错,Linux Node: 6.11.0 fs.js:732 var r = binding.read(fd, buffer, offset, length, position); ^ Error: EISDIR: illegal operation on a directory, read at Error (native) at Object.fs.readSync (fs.js:732:19) at tryReadSync (fs.js:487:20) at Object.fs.readFileSync (fs.js:535:19) at slocResult.fileList.reduce (/home/polunzh/.nvm/versions/node/v6.11.0/lib/node_modules/cqc/src/SlocChecker/index.js:14:36) at Array.reduce (native) at SlocChecker.check (/home/polunzh/.nvm/versions/node/v6.11.0/lib/node_modules/cqc/src/SlocChecker/index.js:13:42) at CodeQualityChecker.check (/home/polunzh/.nvm/versions/node/v6.11.0/lib/node_modules/cqc/src/CodeQualityChecker/index.js:17:45) at Object.<anonymous> (/home/polunzh/.nvm/versions/node/v6.11.0/lib/node_modules/cqc/bin/cqc.js:41:38) at Module._compile (module.js:570:32) at Object.Module._extensions..js (module.js:579:10) at Module.load (module.js:487:32) at tryModuleLoad (module.js:446:12) at Function.Module._load (module.js:438:3) at Module.runMain (module.js:604:10) at run (bootstrap_node.js:389:7) |
26 iugo 2017-09-21 09:24:01 +08:00 ``` cqc src/**/*.jsx src/**/**/*.jsx src/**/**/**/*.jsx src/**/**/**/**/*.jsx src/**/*.js src/**/**/*.js src/**/**/**/*.js src/**/**/**/**/*.js Number of files: 557 Source lines of code: 19665 Duplicate rate: 9.61% Max complexity: 12 Complexity > 5 (count): 10 Complexity > 10 (count): 1 Complexity > 20 (count): 0 ``` |
27 jjplay 2017-09-21 09:30:03 +08:00 cqc bin/cqc.js 会不会更棒! |
31 ma125125t 2017-09-21 09:41:01 +08:00 有个问题我不明白,我的 mac 安装任何软件都需要 sudo 权限,否则就会提示 permission denied,无论用 npm,还是其他安装工具,这是为什么呢? |
33 xcatliu OP @AlloVince > 不知道源代码里一些 ES 的语法是怎么处理的,扫描的源码里使用了 decorators,object rest spread 等一些需要 babel 的语法 代码行数和重复率检查是(基本上)语言无关的,所以可以识别。Complexity 是使用的 eslint 识别的,默认加上了 babel-eslint parser,所以应该可以识别 decorators,object rest spread 语法 详见 https://github.com/xcatliu/cqc/blob/master/src/ComplexityChecker/eslintConfig.js |
37 page470075640 2017-09-21 09:50:36 +08:00 1 https://github.com/pagewang0/form-validation Number of files: 1 Source lines of code: 207 Duplicate rate: 0.00% Max complexity: 22 Complexity > 5 (count): 1 Complexity > 10 (count): 1 Complexity > 20 (count): 1 |
38 xcatliu OP @orange666 需要 node 环境。运行 npm i cqc -g 可以安装 cqc 命令,然后运行 cqc src/**/*.js 可以测所有 js 文件 |
39 xcatliu OP @imlinhanchao 要支持其他语言的代码,应该需要一个一个去适配 |
41 VtoEXL 2017-09-21 09:59:36 +08:00 不支持.vue 文件 |
42 xcatliu OP @polun > Error: EISDIR: illegal operation on a directory, read 看 log 应该是把 dir 当成 file 去 read 了。 已修复,可以试一下新版本还有没有问题 npm i -g [email protected] |
44 xcatliu OP @jjplay cqc 自身的检测结果挺好的哇 Number of files: 8 Source lines of code: 360 Duplicate rate: 0.00% Max complexity: 4 Complexity > 5 (count): 0 Complexity > 10 (count): 0 Complexity > 20 (count): 0 |
46 xcatliu OP @page470075640 不错,不过 max complexity 有点高了,根据 [这个] 的说法: In general, for method level complexity: < 10 Easy to maintain 11-20 Harder to maintain 21+ Candidates for refactoring/redesign [这个]: https://softwareengineering.stackexchange.com/questions/101830/what-does-the-cyclomatic-complexity-of-my-code-mean |
47 xcatliu OP @VtoEXL sloc 暂时还不支持 vue 格式 https://github.com/flosse/sloc/issues/88 |
49 fds 2017-09-21 10:47:57 +08:00 游戏服务器 ts 生成的 js 分析结果: Number of files: 188 Source lines of code: 55663 Duplicate rate: 22.44% Max complexity: 145 Complexity > 5 (count): 97 Complexity > 10 (count): 69 Complexity > 20 (count): 26 辣眼睛……正在翻阅 verbose 结果中…… |
50 wyk52012 2017-09-21 10:53:15 +08:00 公司有 sonar。。。。 |
54 dreamwar 2017-09-21 11:43:56 +08:00 哈哈哈,很溜,有点像 360 开机时候提示你打败了全国多少人一样 |
55 figofuture 2017-09-21 11:47:10 +08:00 mark 了 |
56 SakuraKuma 2017-09-21 12:20:12 +08:00 Number of files: 60 Source lines of code: 16892 Duplicate rate: 4.74% Max complexity: 39 Complexity > 5 (count): 25 Complexity > 10 (count): 10 Complexity > 20 (count): 4 emmmm |
57 page470075640 2017-09-21 12:58:35 +08:00 @xcatliu 我的那个两百多行的代码 我不晓得如何进一步改进了 还望指正 |
58 jedihy 2017-09-21 13:09:40 +08:00 静态代码分析已经有非常成熟的产品了,上学期有门课的老师就是这个领域的大牛,可以试试这个 https://deepscan.io |
59 NCE 2017-09-21 13:21:03 +08:00 要解析一个项目需要多长时间? |
60 NCE 2017-09-21 13:21:32 +08:00 Number of files: 1644 Source lines of code: 129596 Duplicate rate: 1.17% Max complexity: 0 Complexity > 5 (count): 0 Complexity > 10 (count): 0 Complexity > 20 (count): 0 |
62 rashawn 2017-09-21 14:05:31 +08:00 Number of files: 286 Source lines of code: 72966 Duplicate rate: 2.91% Max complexity: 158 Complexity > 5 (count): 146 Complexity > 10 (count): 85 Complexity > 20 (count): 31 |
63 hanzichi 2017-09-21 15:48:06 +08:00 cat 胸去 alloyteam 啦? |
64 xcatliu OP hanzichi 嗯 |
66 page470075640 2017-09-21 22:51:04 +08:00 Number of files: 1 Source lines of code: 192 Duplicate rate: 0.00% Max complexity: 19 Complexity > 5 (count): 1 Complexity > 10 (count): 1 Complexity > 20 (count): 0 谢咯 感觉这个 Complexity 是时间复杂度对吧 |
67 xcatliu OP @page470075640 这里的复杂度不是时间复杂度,是圈复杂度,也叫循环复杂度( Cyclomatic complexity ),就是程序的流程图里面的圈的数量。它决定了程序的可读性和可维护性。 少于 10 易于维护 多于 10 少于 20 难维护 超过 20 就不可维护了 |
69 jisi724 2017-09-22 02:34:52 +08:00 Number of files: 58 Source lines of code: 1471 Duplicate rate: 1.04% High complexity rate: 1.72% Max complexity: 14 |
71 k9982874 ``` Number of files: 13 Source lines of code: 1083 Duplicate rate: 5.24% High complexity rate: 7.69% Max complexity: 19 ``` |
72 zoffy 2017-09-22 09:18:54 +08:00 比较好奇重复率的算法怎么写的 |
75 qichunren 2017-09-22 10:37:52 +08:00 你的这个工具要是再支持一些其它的如 c,c++,ruby,python 之类的就好了。 |
76 ThomasChan 2017-09-22 11:08:38 +08:00 Number of files: 280 Source lines of code: 57742 Duplicate rate: 7.52% High complexity rate: 26.43% Max complexity: 65 complexity 超过 20 难以维护?。。。。 |
77 pengfei 2017-09-22 11:17:52 +08:00 /i/h3P3KZWh.png 代码有点少 |
78 pengfei 2017-09-22 11:18:02 +08:00 |
79 run2 2017-09-22 14:00:22 +08:00 |
80 xcatliu OP @sobigfish 感谢提醒,这个项目依赖了 sloc, jscpd, eslint 等,他们都是 MIT 协议。 我从开源社区的收获远比我的贡献多,所以我的所有项目几乎都是 MIT 协议,希望能够给开源社区贡献一点力量! |
81 jianghu521 2017-09-22 19:32:19 +08:00 zsh: command not found: cpc @xcatliu |
82 xcatliu OP @jianghu521 cqc 不是 cpc 哈 |
83 Hilong 2017-09-22 19:44:39 +08:00 via Android 不支持 vue 文件。。。 |
84 jianghu521 2017-09-22 19:45:41 +08:00 @xcatliu 嗯 谢谢 写错了 |
85 jianghu521 2017-09-22 19:58:22 +08:00 Number of files: 344 Source lines of code: 26728 Duplicate rate: 0.00% Max complexity: 0 Complexity > 5 (count): 0 Complexity > 10 (count): 0 Complexity > 20 (count): 0 @xcatliu 是不是有问题啊 |
86 Maic 2017-09-22 23:43:34 +08:00 git:(master) node_modules/.bin/cqc back/* Number of files: 8 Source lines of code: 773 Duplicate rate: 1.23% High complexity rate: 0.00% Max complexity: 8 git:(master) node_modules/.bin/cqc back/*/* Number of files: 7 Source lines of code: 419 Duplicate rate: 0.00% High complexity rate: 0.00% Max complexity: 5 git:(master) node_modules/.bin/cqc back/ Number of files: 0 Source lines of code: 0 Duplicate rate: 0.00% High complexity rate: NaN% Max complexity: 0 git:(master) node_modules/.bin/cqc back/* back/*/* Number of files: 15 Source lines of code: 1192 Duplicate rate: 0.84% High complexity rate: 0.00% Max complexity: 8 --- 是我写的规则不对嘛 |