今天接到一个需求,需要统计整个项目的代码量,为了系统且清晰的统计到整体的代码量,我还是做了些工作的。
于是这篇文章便诞生了。
Tasking
要做代码量统计,大致需要以下工作
贴出代码
具体如何操作,看这里
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
,必填
执行统计报告生成
- cloc安装
npm i cloc
- 我将循环遍历仓库,执行统计并合并最终报告的脚本做了下封装,这里贴出来,不感兴趣实现的,直接CV使用即可。
- 脚本中4个变量需要根据实际情况,进行配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87const 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());- cloc安装
结果
- 利用Excel筛选,即可操作这样完整的数据。比如利用筛选,我快速了解到项目组共34个仓库,代码行数1340244,不得不说还是挺多的。。。。当然因为项目中存在部分vendor资源,即水分。
- 发现cloc进行统计存在一个问题,比如文件夹下直接统计N个项目的代码量与如上循环遍历统计的代码量之和存在较大出入。我认为具体仓库统计的是对的。
写到最后
如上,操作已经脚本化,类似需求以后无非2句命令即可。妈妈再也不担心如何做项目代码统计了。