当前位置: 首页 > 工具软件 > Husky > 使用案例 >

Husky v5+ 版本原理

司马璞
2023-12-01

git hooks

对于git hooks大家往往第一时间想到的就是.git/hooks/下的对应的git生命周期的脚本。

husky的变化

在前端项目中,通过使用husky来管理git hooks是很常见的方案,在v5版本之前husky
恰恰是用的这种方式,在初始化脚本的时候会直接修改当前项目下.git/hooks/下的对应的git生命周期的脚本。但是从v5版本开始,使用者可以发现,husky初始化以后会在项目文件夹创建一个默认名为.husky目录,而对应的git hooks控制脚本也在此目录下编写,而非.git/hooks/下。

实现原理

初始化

其核心代码如下:

// Create .husky/_

fs.mkdirSync(p.join(dir, '_'), { recursive: true })

// Create .husky/_/.gitignore

fs.writeFileSync(p.join(dir, '_/.gitignore'), '*')

// Copy husky.sh to .husky/_/husky.sh

fs.copyFileSync(p.join(__dirname, '../husky.sh'), p.join(dir, '_/husky.sh'))

// Configure repo

const { error } = git(['config', 'core.hooksPath', dir])

运行步骤

1、【创建hooks目录】上面提到v5的husky自动创建.husky目录收录git hooks控制脚本,其目录地址其实是支持自定义的,可见【传送门
2、【更新gitignore文件】创建好第一步的文件目录后会自动更新当前项目的.gitignore文件设置其忽略
3、【拷贝增加husky.sh】这一步脚手架会将既定好的husky.sh脚本拷贝的指定目录的_/下,是husky内置的支持通用的处理逻辑的脚本,有需要可以自行拓展,基本可以忽略。
4、【设置core.hookspath】主要是利用了gitcore.hookspath这个配置项,在git 2.9及以上版本则开始支持对应配置项【传送门】,其作用便是指定git hooks的执行脚本目录。

添加hooks脚本

npx husky add .husky/pre-commit "npm test"

运行步骤

1、判断对应hooks文件是否存在
2、存在对应hooks文件则追加对应脚本命令
2、不存在对应hooks文件则创建对应文件然后写入对应脚本命令

其核心代码如下:

if (fs.existsSync(file)) {
    fs.appendFileSync(file, `${cmd}\n`)
} else {
    set(file, cmd) // 创建文件然后写入函数,不展开了就
}
 类似资料: