在推行代码规范的时候,绝大多数情况下都会遭到不小的阻力,一来每个人的代码习惯不一致,要人轻易改变习惯确实也不是一朝一夕的事情,二来一般都会带来额外的开发成本和其它困扰。我们不禁在想,推行代码规范的困难点在哪里,以及如何解决这些痛点,让各个角色更容易接受呢?

归纳起来,推行规范的过程中,最常听到的几点担忧有:

是否带来额外的开发成本

规范的执行力度有强制性吗

已经开发的分支,合入的时候遇到大量冲突谁来解决

存量代码如何解决

被修复的代码,后面一看最后修改人全部都是运行 eslint --fix 的那个人怎么办

根据经验,有以下的解决办法:

规范已经集成在编辑器里,开发的时候就已经能够发现问题,对于是否有分号的这种问题,工具能修复的,就不用花大力气去讨论谁是谁非的问题。并且配置好,在 commit 的时候就尽可能地自动修复问题,除非是真正的问题,并且工具不能自动修复的才需要人工修复。

将代码 MR 加入流程自动扫描,并且设置质量红线,有引入新问题的,就禁止合入

先合并修复分支,冲突部分全部选择自己的改动,在解决冲突后要 commit,因为配置了 lint-staged,那么这些冲突的文件在合并上去的时候又会被自动修复,这样就达到了合并和修复的双重目的

存量代码要不要解决,答案当然是要的,但是就会带来第 5 个问题,修复的代码丢失了最后修改人的记录怎么办,所以终究还是要解决的是第 5 个问题。

那么我们考察市面上是否有解决方案

难道真的没有解决办法了吗?

我们研究了 ESLint 的修复流程

发现是不是只要定制化输出报告就可以针对指定人员做修复?

那么让我们看一下报告都有哪些信息。

line: 待修复的代码开始行

endLine: 结束行

range: 修复的代码位置

text: 变更后的代码片段

那么是否只要判断 line 和 endLine 在文件里相应位置的作者信息,用一个数组的 filter 就可以解决了?然后发现实际上并不生效并且还有错误。因为:

修复只是将 output 里的代码替换掉整个文件

messages 里的项是线性叠加的,后面一项是依赖于前面一项的。也就是当前项的 line 和 endLine 是根据上一项修复的结果。如果前面有一项有行列变动的话,那么当前的修复也跟原文件是对应不上的。

问题好像又回到了无法解决的原点。在仔细研究了 Node.js API 文档后,我们发现有趣的一句话:

fix - This can be a boolean or a function which will be provided each linting message and should return a boolean. True indicates that fixes should be included with the output report, and that errors and warnings should not be listed if they can be fixed. However, the files on disk will not be changed. To persist changes to disk, call outputFixes().

意思是 fix 参数是支持函数的,messages 只是包含每个收集到的可修复信息,但是会视 fix 返回值来决定是否将可修复信息真的应用到修复上,也就是是否会在 output 上体现。

这就给我们带来了可操作的空间,在 fix 函数里去判断是否是相关联作者,如果是就返回 true,如果不是就返回 false。大概的流程是这样的:

以及看一下相关代码

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

// @ts-ignore eslint 的提示是错的,fix 可以是 boolean,也可以是 () => boolean

baseConfig.fix=(info:IMessage)=>{

messages.push(info);

const{fix,line}=info;

// 不可修复,直接返回

if(!fix){

returnfalse;

}

letshouldFix:boolean=false;

// 处理的文件变化了

if(lastFile!==currentFile){

lastFile=currentFile;

// 生成未修复前的文件每一行的最后修改人

authByEachLine=getAuthByEachLine(currentFile);

// 读取文件内容

sourceCode=fs.readFileSync(currentFile,"utf8");

// 更新记录当前文件的基本信息

bom=sourceCode.startsWith(BOM)?BOM:"";

sourceCode=bom?sourceCode.slice(1):sourceCode;

lastPos=Number.NEGATIVE_INFINITY;

output=bom;

}

const[codeStart,codeEnd]=fix.range;

// 获取将要被改变的源码信息

constchangedCode=sourceCode.slice(codeStart,codeEnd);

constoriginLineCount=fix.text.split("\r?\n").length;

constchangeLineCount=changedCode.split("\r?\n").length;

constchangeAuth=authByEachLine[line]||unknown;

// 行数有变动,更新 authByEachLine

if(originLineCount!==changeLineCount){

authByEachLine.splice(

line,

originLineCount,

...newArray(changeLineCount).fill(changeAuth)

);

}

// 第一次找到了当次要做修复的作者, 要包含当次 fix 信息

if(!filterAuth){

filterAuth=changeAuth;

shouldFix=true;

}elseif(changeAuth===filterAuth){

// 符合当次修复的作者,要包含当次 fix 信息

shouldFix=true;

}

if(shouldFix){

// 运用修复,更新文件源码

shouldFix=attemptFix(fix);

}

// 确实被修复了,更新统计信息

if(shouldFix){

if(info.severity===2){

fixableErrorCount+=1;

}elseif(info.severity===1){

fixableWarningCount+=1;

}

}

returnshouldFix;

};

在我们过滤了指定人员的修复报告后,只需要循环按人员来修复就可以了,用 git commit -m "xxx" --auth "auth " 来保存修改人信息

最后是我们达到的效果,比如有个文件的内容和修改人信息如下:

经过工具修复后:

可以看到 14 - 16 行,27 - 29 行即使有行变动,依然能完整保留最后修改人的信息。

git blame 工具仍维持着原修改人

编辑器里看到的也是经过我们处理过的最后修改人

git log 上看到的也都是按每个修改人去做的自动修复记录

在 git blame --line-porcelain 能同时看到修改人和提交人

至此,我们可以说我们已经有了解决这个问题的完整方案,并且切实可行。我们将工具开源到 github 上,制作发布了 npm 包,欢迎试用和提问题。

eslint 保存自动修复_ESLint 自动修复问题之如何保留最后修改人信息相关推荐

  1. 关闭eslint检查2020_2020 vscode配置eslint保存后自动fix

    2020 vscode配置eslint保存后自动fix 这篇文章发布于 2019/10/12,归类于 计算机基础与开发工具 标签: vscode 保存自动fix,vscode 保存执行fix,esli ...

  2. 获取保存在沙盒中plist文件的用户的字典信息

    获取保存在沙盒中plist文件的用户的字典信息

  3. 把数据保存到数据库附加表 `dede_addonarticle` 时出错,请把相关信息提交给DedeCms官方

    把数据保存到数据库附加表 `dede_addonarticle` 时出错,请把相关信息提交给DedeCms官方 昨天编辑忽然跟我说dedecms后台文章发布不了,提示错误,如图: 把数据保存到数据库附 ...

  4. Python--selenium 加载并保存QQ群成员,去除其群主、管理员信息

    Python–selenium 加载并保存QQ群成员,去除其群主.管理员信息. 一位老哥自己开了个游戏,想在群里拉点人,就用所学知识帮帮忙,于是就有了这篇文章... 拙笔,拿来分享一下.纯属原创,其他 ...

  5. vscode 新版eslint自动修复_vscode自动修复eslint规范的插件及配置

    在开发大型项目中,经常都是需要多人合作的.相信大家一定都非常头疼于修改别人的代码的吧,而合理的使用eslint规范可以让我们在代码review时变得轻松,也可以让我们在修改小伙伴们的代码的时候会更加清 ...

  6. eslint 保存自动格式化_ESLint一款可组装的JavaScript和JSX检查工具

    使用vs code为例,创建项目ESLintDemo npm initnpm install --save-dev eslingeslint --init 项目的基本目录 产生.eslintrc文件, ...

  7. VScode配置eslint保存自动格式化,eslint格式化去掉分号和双引号。vscode自动保存去掉分号和双引号;““

    本文是开启eslint检验和配置eslint格式化:如果想要关闭eslint,查看这篇关闭eslint方法: 1.必须安装的三个插件eslint, prettier-Code formatter ,v ...

  8. eslint 快捷键设置_ESLint使用指南

    介绍 在团队协作中,为避免低级 Bug.产出风格统一的代码,会预先制定编码规范.使用 Lint 工具和代码风格检测工具,则可以辅助编码规范执行,有效控制代码质量. 安装 局部安装 npm instal ...

  9. 惠普一开机就自动修复_Win10自动修复无法开机的解决方法(完美解决)

    Windows10操作系统于2015年7月29日正式发布,此后,win10也就成了新上市的笔记本电脑或者台式机电脑的预装操作系统!win10系统给我们带了全新的体验,当然也带来了一定的烦恼!就拿win ...

  10. eslint 保存自动格式化_代码规范之理解ESLint、Prettier、EditorConfig

    授权转载自:nowThen https://juejin.cn/post/6895889063111294990 前言 团队多人协同开发项目中困恼团队管理一个很大的问题是:无可避免地会出现每个开发者编 ...

最新文章

  1. 170个新项目,579个活跃代码仓库,Facebook开源年度回顾
  2. 【转】DHCP工作过程详解
  3. ChemDataExtractor:从PDF、HTM、文本等中提取化学数据
  4. 杭电 1711 Number Sequence 1686 2203
  5. Nginx 为什么快到根本停不下来?
  6. iOS 移动端overflow:auto 滚动不平滑及bug处理
  7. php 筛选搜索,筛选——搜索
  8. POSIX 条件变量
  9. 中药的专利标准化研究
  10. 五大主流浏览器内核的源起以及国内各大浏览器内核总结
  11. c语言各类型数据混合运算
  12. 经典的Embedding方法Word2vec
  13. 企业如何通过APS系统进行产能规划?
  14. 可能是这个夏天最有趣的100米了!| 谁在Reading Park
  15. [USACO2.4]两只塔姆沃斯牛 The Tamworth Two
  16. 6步安全解决WinRAR弹出广告,新版通用保姆级教程,收藏备忘无忧
  17. java的depot类有什么方法_HP-UNIX depot软件安装方法
  18. android saf 打开指定目录,并操作相关文件
  19. alpha因子常见问题_手把手教你构建量化因子分析体系
  20. 学校网站建设需要把握的四个方面

热门文章

  1. Oracle Solaris 11 11/11 新增功能
  2. 卡巴斯基安全软件2014(78三年,逢周一68)时间:2013.10.1-2013.10.31
  3. 自定义Button按钮
  4. 解决精简版的XP下,无法使用运程桌面
  5. Android的Jetpack概括
  6. python 判断点在随机多边形内_Python确定散点是否在多边形内,python,判断,内部
  7. java打印等腰三角形_为什么大家都说Java中只有值传递?
  8. PHP学习笔记二(面向对象和表单)
  9. ajax清除session,跳出iframe框架页面后跳转页面
  10. 柳氏管理学:感恩是双向的,强调单方面都是别有用心