Husky在monorepo下的问题

目标是给pipeline加上自动格式化

Husky的网上流传方法是 npx husky install,之后package.json里增加"husky"字段,但是这方法是version 4 version 6的时候的方法,现在都version8了。新版是npx husky pre-commit xxxxx手写钩子。

这么搞的意义就是在于现在前端流行monorepo,旧版的对稍微复杂点的monorepo结构就不好用了。我就是....


从头讲:

前端Pipeline最多的是husky+lint-staged

husky是给git上钩子,可以只对有修改的文件进行处理,不然就得自己去研究钩子怎么写(文末介绍)。

lint-staged是因为husky支持的命令不多,eslint就不支持,而且lint-staged能对文件进行一次过滤(文末介绍)。

三条路:

1. 在根目录下(有.git文件存在的位置),npx husky install生成钩子, 然后package.json里增加husky字段和lint-staged字段,正常来说全局安装husky,然后husky命令就会去找husky字段。但是monorepo下命令无法指向husky字段

2. husky install是version 4 version 6的事了,换version8的推荐办法,npx husky pre-commit,直接会生成一个pre-commit文件,里面写npx lint-staged。 之后这个命令能指向monorepo中的package.json中的lint-staged字段。但是这个方法每次pipeline都自动安装一遍npx,根本不去读取环境里的npx,要是直接写lint-staged更是不知道自动安装lint-staged,运行不了。

3. 在有packaged.json的位置上,运行npx mrm@2  xxxxxxx命令,会自动下载husky和lint-staged,还会自动进行配置。但是monorepo下,自动配置的过程中找不到.git的位置,也无法给指定.git的位置。


结局:我真的谢了,研究了一圈,monorepo想上husky,还就是得自己写钩子的shell。好在husky还是提供了样例typicode.github.io/husky/   结合git提供的样例 .git/hooks/pre-commit.sample     还是能快速上手拼出来。


Git钩子

.git/hooks/位置下其实可以看到很多xxx.sample,这个是github的钩子样例,去掉".sample"之后钩子就能原地生效。相应的,husky的方法就是在项目下建立钩子,npx husky xxxx命令是一定需要当前位置存在.git文件夹的,但是在monorepo下,项目的package.json不一定也在当前位置。而如果使用旧版方法,husky install,其实就是将钩子的命令导入到package.json里面的husky字段下,这在monorepo里大概率就过不去,因为结构不行。


为什么要lint-staged

husky能 prettier --fix --staged    但是跑不了eslint

必须要lint-staged才能跑eslint --write,而且lint-staged可以对文件名正则匹配过滤。husky只能让所有commit的文件都改变。

Format和Lint

prettier是前端的自动化代码格式化工具,有几个语法规则prettier.io/docs/en/options.html,但其实没什么用,最主要的就是个max-length,限制长度换行。

tslint在新版里,已经彻底弃用了自己,所有功能都在eslint里,可以在官网看到提供的自动tslint转eslintd的工具。但是eslint里的规则是真的真的多eslint.bootcss.com/docs/rules/    我挨个都看了,但是其实没什么太多用,而且里面有些规则还能导致项目编译失败 - -  

除了这些,还有个strict model,感觉用起来挺不爽的,但是可以防呆防傻。

如果运行了npx eslint . --write,那么原先的tslint插件也最好整理一下,有些红线格式报错纯粹是插件自己眼神不好。

eslint建议少开规则,跟prettier冲突的规则建议优先prettier。prettier可以放在自动化里。

你可能感兴趣的:(Husky在monorepo下的问题)