基于git diff的eslint代码检测

基于git diff进行的eslint代码检测

随着代码的不断增加, eslint进行代码检测的时间也越来越久。每次检测的时候, 需要检测的文件和实际检测的文件极度不对称,所以便基于git diff写了这样一个小工具。

源代码

  • 启动脚本(lint.sh)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
INFO='\033[36m';
NOR='\033[0m';
ERR='\033[31m';
br='dev';
if [ ! -z $1 ]; then
br=$1;
fi;
echo -e "${INFO}run lint now ... just wait a moment ...${NOR}";
git diff origin/${br} > diff.log;
log=`cat diff.log | grep 'diff --git a/src'`;
if [[ -z ${log} ]]; then
echo -e "${INFO}没有文件发生变化${NOR}";
else echo '';
node ./lint-by-diff.js;
echo -e "${INFO}done ...${NOR}";
fi;
rm diff.log change.log 2> /dev/null;
read;
  • 检测工具(lint-by-diff.js)
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
'use strict';
const fs = require('fs');
const shelljs = require('shelljs');

const jsFiles = [],
LOG__PATH = './diff.log',
FILE = /diff --git a([\s\S]*?) /g,
data = fs.readFileSync(LOG__PATH).toString(),
_files = data.match(FILE),
len = _files.length;

let i = 0;
while (i < len) {
const _item = _files[i++].trim();
if (!/.js$/.test(_item)) continue;
const item = './' + _item.slice(13);
if (!/^\.\/src\//.test(item)) continue; // src为项目需要进行eslint检测的目录
if (!fs.existsSync(item)) continue;
jsFiles.push(item);
}
console.log('------------------------------');
console.log(' 以下文件发生改变: ');
console.log(jsFiles.join('\n'));
console.log('------------------------------');
shelljs.exec('node ./node_modules/eslint/bin/eslint.js ' + jsFiles.join(' '));

原理

通过git diff origin/branch获取到和指定分支的不同, 从而知道哪些文件需要进行代码检测(dev上的是通过检测的), 然后运行eslint的时候就指定这部分文件。

使用

在项目根目录下输入./lint.sh或者bash ./lint.sh, 默认分支为dev分支, 如果需要指定其他分支, 可以在运行的时候传入参数, 如: bash ./lint.sh master.

不足

  • 使用了bash导致这个看起来有点不伦不类, 使用纯js也许会更好, 但是我毕竟半吊子, 写不出来→_←

  • 没有对error进行高亮显示, 所以看起来会比较费力