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

于是这篇文章便诞生了。

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

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

具体如何操作,看这里

  1. clone repository
  • 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个变量需要根据实际情况,进行配置

```javascript
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句命令即可。妈妈再也不担心如何做项目代码统计了。

--

--

--

Develop with pleasure!

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Alan He

Alan He

Develop with pleasure!

More from Medium

Week 6 Abstract

Let’s Find a Solution to Beat Pollution!

Lost In Translation