V2EX 首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Sponsored by
二向箔安全
​一对一的线上 web 安全培训服务
咨询微信:twosecurityrefer
Promoted by 二向箔安全
V2EX  ›  程序员

运行一个脚本,看看你的项目的代码质量吧

  •  2
     
  •   xcatliu · 87 天前 · 8353 次点击
    这是一个创建于 87 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码质量有很多指标:

    1. 源代码行数
    2. 代码重复率
    3. 圈复杂度
    4. 报错量( Bug 数)占比
    5. 测试覆盖率
    6. 开发约束(代码块行数等)

    我做了一个脚本可以测出上面的 1, 2, 3

    大家都来试一试吧!

    Installation

    npm install -g cqc
    

    Usage

    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
    

    Multiple patterns

    cqc src/**/*.js src/**/*.jsx
    

    --ignore-pattern

    cqc src/**/*.js --ignore-pattern src/vendor/**/*.js
    
    cqc src/**/*.js --ignore-pattern src/vendor/**/*.js,src/third-party/**/*.js
    

    --ignore-file

    cqc src/**/*.js --ignore-file .gitignore
    
    cqc src/**/*.js --ignore-file .gitignore,.eslintignore
    

    --format

    cqc src/**/*.js --format json
    

    Output:

    {
        "numberOfFiles": 8,
        "sloc": {
            "source": 357
        },
        "jscpd": {
            "percentage": "5.62"
        },
        "complexity": {
            "max": 15,
            "gt5Count": 3,
            "gt10Count": 1,
            "gt20Count": 0
        }
    }
    
    第 1 条附言  ·  87 天前

    文档写错了,--ignore-file 应该是 --ignore-path

    另外还有一个参数是 --verbose 可以打印出更多信息

    第 2 条附言  ·  86 天前

    v0.2.0

    更新输出格式为:

    Number of files:        9
    Source lines of code:   463
    Duplicate rate:         15.71%
    High complexity rate:   11.11%
    Max complexity:         19
    

    增加 --complexity-threshold 参数,默认为 10

    86 回复  |  直到 2017-09-22 23:43:34 +08:00
        1
    xcatliu   87 天前
    先来贴一个我们团队的项目的:

    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   87 天前   ♥ 1
    试了一下,Mac 运行报错。

    env: node\r: No such file or directory

    Node:v8.1.3
        3
    xcatliu   87 天前
    @iluhcm 感谢反馈,已修复,是换行符的问题。
    可以安装新版本试试啦
    npm i cqc@0.1.2 -g
        4
    siteshen   87 天前   ♥ 4
    看标题还以为支持所有语言,结果打开 GitHub 才发现只支持前端的内容。

    发在“程序员”节点,希望标题里有“前端”、“ Javascript ” 之类的字样。
        5
    xcatliu   87 天前
    @siteshen 因为 complexity 是用 eslint 实现的,所以暂不支持其他语言的 complexity。重复度检查是给予 jscpd 的,所以支持很多语言。
        6
    spring5413   87 天前   ♥ 1
    请问大神,这个检查重复原理是什么
        7
    vardarling   87 天前   ♥ 1
    "Souce lines of code" bug +1 😆
        8
    xcatliu   87 天前 via iPhone
    @vardarling lines of source code 😂
        9
    xcatliu   87 天前 via iPhone
    @vardarling 第一次还没看出来,原来是少了个 r 😂
        10
    xcatliu   87 天前
    @vardarling 已修复,谢谢反馈 😀
        11
    xcatliu   87 天前
    @spring5413 是基于 jscpd 的,原理应该就是静态的分析两个文件有没有连续的重复行,超过五行即视为代码有重复。
    https://github.com/kucherenko/jscpd
        12
    vardarling   87 天前
    @xcatliu 第一次发现我眼睛这么好😂
        13
    zhlssg   87 天前 via iPhone
    这个有点厉害
        14
    mhycy   87 天前   ♥ 11
    “您的代码质量分已超过 90%程序员,点击按钮一键优化”
        15
    xcatliu   87 天前 via iPhone
    @mhycy 这个可以😂
        16
    AlloVince   87 天前   ♥ 1
    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
        17
    xcatliu   87 天前
    @AlloVince 很健康的数据啊
        18
    AlloVince   87 天前   ♥ 1
    @xcatliu 不知道源代码里一些 ES 的语法是怎么处理的,扫描的源码里使用了 decorators,object rest spread 等一些需要 babel 的语法
        19
    binux   87 天前   ♥ 1
    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   87 天前   ♥ 1
    cqc... 这名字怎么这么谐
        21
    Sapp   87 天前   ♥ 1
    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   86 天前   ♥ 1
    新手一枚,看到就试试,怎么用的这玩意。
        23
    imlinhanchao   86 天前   ♥ 1
    记得 Coding 自带这个功能,而且不仅支持前端代码。 @Bazingawang
        24
    iugo   86 天前
    不知道 pattern 该怎么写.

    `cqc src/**/*.js src/**/*.jsx` 却只找到一个 jsx 文件...
        25
    polun   86 天前   ♥ 1
    报错,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   86 天前
    ```
    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   86 天前   ♥ 1
    cqc bin/cqc.js 会不会更棒!
        28
    xcatliu   86 天前 via iPhone
    @iugo 是不是在 windows 环境下?
        29
    iugo   86 天前
    @xcatliu macOS 10.12.6, VS Code 终端
        30
    iugo   86 天前
    @xcatliu Node v8.4.0 npm v5.4.2
        31
    ma125125t   86 天前   ♥ 1
    有个问题我不明白,我的 mac 安装任何软件都需要 sudo 权限,否则就会提示 permission denied,无论用 npm,还是其他安装工具,这是为什么呢?
        32
    xcatliu   86 天前
    @iugo 试一下加上双引号呢? cqc "src/**/*.js" "src/**/*.jsx"
        33
    xcatliu   86 天前
    @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
        34
    xcatliu   86 天前
    @binux 重复率 0.19% 是怎么做到的,厉害。
        35
    xcatliu   86 天前
    @momocraft cqc 就是 Code Quality Checker
        36
    xcatliu   86 天前
    @Sapp 测打包后的没什么意义吧
        37
    page470075640   86 天前   ♥ 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   86 天前
    @orange666 需要 node 环境。运行 npm i cqc -g 可以安装 cqc 命令,然后运行 cqc src/**/*.js 可以测所有 js 文件
        39
    xcatliu   86 天前
    @imlinhanchao 要支持其他语言的代码,应该需要一个一个去适配
        40
    iugo   86 天前   ♥ 1
    @xcatliu Ok.
        41
    VtoEXL   86 天前   ♥ 1
    不支持.vue 文件
        42
    xcatliu   86 天前
    @polun
    > Error: EISDIR: illegal operation on a directory, read
    看 log 应该是把 dir 当成 file 去 read 了。
    已修复,可以试一下新版本还有没有问题 npm i -g cqc@0.1.5
        43
    xcatliu   86 天前
    @iugo 加双引号就可以了?估计是 glob 这块有点问题,我看看好不好修复
        44
    xcatliu   86 天前
    @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
        45
    xcatliu   86 天前
    @ma125125t 可以用 nvm 来安装 node 和 npm,应该就不需要 sudo 了吧
        46
    xcatliu   86 天前
    @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   86 天前
    @VtoEXL sloc 暂时还不支持 vue 格式 https://github.com/flosse/sloc/issues/88
        48
    Sapp   86 天前   ♥ 1
    @xcatliu 因为不支持 vue。只能测打包的。
        49
    fds   86 天前   ♥ 1
    游戏服务器 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   86 天前   ♥ 1
    公司有 sonar。。。。
        51
    iugo   86 天前
    @fds 游戏服务也可以用 Node 做? 传说中都是用 C++...
        52
    xcatliu   86 天前
    @wyk52012 sonar 确实是一个好工具!我这只是一个比较轻量的小工具
        53
    xcatliu   86 天前
    @fds Max complexity 145 也是厉害!
        54
    dreamwar   86 天前
    哈哈哈,很溜,有点像 360 开机时候提示你打败了全国多少人一样
        55
    figofuture   86 天前
    mark 了
        56
    SakuraKuma   86 天前
    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   86 天前   ♥ 1
    @xcatliu 我的那个两百多行的代码 我不晓得如何进一步改进了 还望指正
        58
    jedihy   86 天前   ♥ 1
    静态代码分析已经有非常成熟的产品了,上学期有门课的老师就是这个领域的大牛,可以试试这个
    https://deepscan.io
        59
    NCE   86 天前   ♥ 1
    要解析一个项目需要多长时间?
        60
    NCE   86 天前
    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
        61
    orange666   86 天前
    @xcatliu 酱紫啊 谢谢啊
        62
    rashawn   86 天前
    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   86 天前   ♥ 1
    cat 胸去 alloyteam 啦?
        64
    xcatliu   86 天前 via iPhone
        65
    xcatliu   86 天前 via iPhone
    @NCE 大概是每秒一万行代码吧
        66
    page470075640   86 天前   ♥ 1
    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   86 天前
    @page470075640 这里的复杂度不是时间复杂度,是圈复杂度,也叫循环复杂度( Cyclomatic complexity ),就是程序的流程图里面的圈的数量。它决定了程序的可读性和可维护性。

    少于 10 易于维护
    多于 10 少于 20 难维护
    超过 20 就不可维护了
        68
    xcatliu   86 天前
    @jedihy 感谢,以前只知道 sonar,已收藏。
        69
    jisi724   85 天前   ♥ 1
    Number of files: 58
    Source lines of code: 1471
    Duplicate rate: 1.04%
    High complexity rate: 1.72%
    Max complexity: 14
        70
    xcatliu   85 天前 via iPhone
    @jisi724 赞,很健康
        71
    k9982874   85 天前
    ```
    Number of files: 13
    Source lines of code: 1083
    Duplicate rate: 5.24%
    High complexity rate: 7.69%
    Max complexity: 19
    ```
        72
    zoffy   85 天前
    比较好奇重复率的算法怎么写的
        73
    fds   85 天前
    @iugo 游戏服务器还有 python 什么的呢。很多游戏计算量不大,就是读读数据库,用什么语言都差不多~
        74
    fds   85 天前
    @NCE 你这分析结果估计是遇上了不支持的语言,不然复杂度不能这么低……
        75
    qichunren   85 天前
    你的这个工具要是再支持一些其它的如 c,c++,ruby,python 之类的就好了。
        76
    ThomasChan   85 天前
    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   85 天前
    /i/h3P3KZWh.png
    代码有点少
        78
    pengfei   85 天前
        79
    sobigfish   85 天前   ♥ 1
    CQC 第一反应是 close quarters combat -。-

    其实我是来提醒作者 https://choosealicense.com/
        80
    xcatliu   85 天前
    @sobigfish 感谢提醒,这个项目依赖了 sloc, jscpd, eslint 等,他们都是 MIT 协议。
    我从开源社区的收获远比我的贡献多,所以我的所有项目几乎都是 MIT 协议,希望能够给开源社区贡献一点力量!
        81
    jianghu521   85 天前
    zsh: command not found: cpc @xcatliu
        82
    xcatliu   85 天前
    @jianghu521 cqc 不是 cpc 哈
        83
    Hilong   85 天前 via Android
    不支持 vue 文件。。。
        84
    jianghu521   85 天前
    @xcatliu 嗯 谢谢 写错了
        85
    jianghu521   85 天前
    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   85 天前
    ➜ 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
    ---

    是我写的规则不对嘛
    DigitalOcean
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   1183 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.0 · 82ms · UTC 16:51 · PVG 00:51 · LAX 08:51 · JFK 11:51
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1