项目代码统计

今天接到一个需求,需要统计整个项目的代码量,为了系统且清晰的统计到整体的代码量,我还是做了些工作的。

于是这篇文章便诞生了。

Tasking

要做代码量统计,大致需要以下工作

  1. 批量clone group下所有仓库日常开发,我们本地并不会clone下所有的仓库代码,因此还是有此需求,批量Clone用ghorg
  2. 循环执行统计脚本,统计工具用cloc
  3. 合并到一个CSV文件

贴出代码

具体如何操作,看这里

  1. clone repository

    1
    ghorg clone groupname --concurrency=50 --protocol=ssh --scm=gitlab --base-url=https://gitlab.com --token=CP-SevCew54pjq_JnuDb
    • ghorg安装参考官网即可
    • 上述token即gitlab账户的access token,必填
  2. 执行统计报告生成

    • cloc安装npm i cloc
    • 我将循环遍历仓库,执行统计并合并最终报告的脚本做了下封装,这里贴出来,不感兴趣实现的,直接CV使用即可。
    • 脚本中4个变量需要根据实际情况,进行配置
    const fs = require('fs');
     const { execSync } = require('child_process');
     
     // 项目代码
     const rootDir = '';
     
     // CLOC Shell路径
     const clocCommand = '/Users/qhe/.nvm/versions/node/v10.16.0/bin/cloc';
     
     // 报告生成临时路径
     const reportFiles = '';
     
     // 总报告名称
     const reportFile = '';
     
     const deleteFolderRecursive = function (path) {
     if (fs.existsSync(path)) {
     fs.readdirSync(path).forEach(function (file, index) {
       var curPath = path + '/' + file;
       if (fs.lstatSync(curPath).isDirectory()) {
         deleteFolderRecursive(curPath);
       } else {
         fs.unlinkSync(curPath);
       }
     });
     fs.rmdirSync(path);
     }
     };
     
     /**
    
      * @description
      * 遍历生成每个仓库代码报告
      */
      function createReport() {
        return new Promise((resolve) => {
          fs.readdir(rootDir, (_0, files) => {
            files.forEach((file) => {
              if (fs.statSync(`${rootDir}/${file}`).isFile()) {
                return;
              }
              execSync(
                `${clocCommand} ${rootDir}/${file} --csv --out=out/${file}.csv`,
                (error, stdout, stderr) => {
                  if (error) {
                    console.log(`error: ${error.message}`);
                    return;
                  }
                  if (stderr) {
                    console.log(`stderr: ${stderr}`);
                    return;
                  }
                  console.log(`stdout: ${stdout}`);
                }
              );
            });
            resolve();
          });
        });
      }
    
    
     /**
     * @description
     * 合并每个仓库的报告到一个CSV文件中
     */
     function mergeReport() {
       let mergedReport = '';
       fs.readdir(reportFiles, (_0, files) => {
         files.forEach((file) => {
           if (file === '.DS_Store') {
             return;
           }
           const contents = fs.readFileSync(`${reportFiles}/${file}`, {
             encoding: 'utf8',
           });
           mergedReport += `${file.replace(/\.csv/, '')},,,,,\n` + contents;
         });
         deleteFolderRecursive(reportFiles);
         fs.writeFile(reportFile, mergedReport, function (err) {
           if (err) {
             console.log(err);
           }
         });
       });
     }
     
     createReport().then(() => mergeReport());
    

结果

  • 利用Excel筛选,即可操作这样完整的数据。比如利用筛选,我快速了解到项目组共34个仓库,代码行数1340244,不得不说还是挺多的。。。。当然因为项目中存在部分vendor资源,即水分。
  • 发现cloc进行统计存在一个问题,比如文件夹下直接统计N个项目的代码量与如上循环遍历统计的代码量之和存在较大出入。我认为具体仓库统计的是对的。

写到最后

如上,操作已经脚本化,类似需求以后无非2句命令即可。妈妈再也不担心如何做项目代码统计了。

参考文档