如何在monorepo中设置赫斯基钩?你为什么要?如何使用它们在团队中执行绒毛政策?
这是另一天的工作。这是工作中的美好一天 - 您完成了工作!您进行更改并推动它们,并在等待CI做事时,要为自己提供一些含咖啡因的饮料。
当您看到CI失败时,您会回来并震惊饮料!如果您只能阻止它!
您记得您的朋友谈论git钩子,并为自己设置一些东西,但是他们的分享想法是向您发送文件。他们说:“很难在monorepo中执行钩子。”
谷歌搜索后,您会发现一篇不错的文章,解释了如何做到这一点(在这里!)。这就是可以做到的:
非常tl; dr
沙哑的钩 - >带有范围 - >单个软件包脚本
的主要monorepo脚本tl; dr
- 在您的主要MonorePo目录中设置Husky&Hook
- 您的钩子应使用MonorePo工具通过使用范围运行特定名称的脚本。
- 您想完成此挂钩工作的每个软件包都应具有其
package.json
文件中定义的同名脚本。
这是关于什么?
Git hooks是在GIT工作流的不同阶段运行的脚本。它们可用于副作用,也可以使流量失败。
例如,当您尝试提交一些东西时,pre-commit
钩子运行。如果失败(使用代码1退出),则不会进行提交。
这是在将开发人员的代码添加到存储库之前实施覆盖和测试的完美机制。
但是,这种方法存在一个问题 - git挂钩是一种git机制 - 它们是本地,用户特定的,并且在您的项目的.git
文件夹中生活。您如何为所有用户执行这个不错的预订脚本?
Husky是一个很棒的软件包,可让您为包装定义挂钩,然后安装它们。但是...
monorepo问题
在monorepos中,您的存储库在单个软件包之外进行管理。
当您尝试将Husky与单独的包裹一起使用时,它就无法正常工作。
# Works okay
> npx husky add .husky/pre-commit "<something to execute>"
# Will not add your pre-commit hook to the right directory...
> npx husky install
# ...so it'll not run when it's supposed to :(
> git commit -m "Blah"
解决方案
我正在为项目使用PNPM和PNPM工作区,因此我将其用于代码示例。它们很容易与您的软件包管理器和MonorePo所选工具互换。
另外,我正在通过添加一个预先承诺的钩子来证明这一点。同样的方法也应与任何其他钩子一起使用。
1.将沙哑安装在您的主要Monorepo中
转到您的主要MonorePo目录,然后运行:
pnpm i -D husky
2.设置主要的预设脚本
在您的主要monorepo的package.json
文件中,设置一个在所有项目中运行特定脚本的预签名脚本。
大多数(或全)monorepo工具都可以通过定义范围来为所有或某些软件包运行脚本。
在我当前的项目中,我确保将所有软件包名称(@product/ui
,@product/api
等)使用npm's scope notation(与我提到的先前范围无关)。这使我可以轻松地在所有软件包上运行一个脚本:
> pnpm run --filter "@product/*" myscript
// main package.json
{
scripts: {
"pre-commit": "pnpm run --filter \"@product/*\" pre-commit"
}
}
在此机会中,您还可以添加一个运行husky install
的koude6 script,因此设置项目的每个用户都会自动添加这些挂钩。
// main package.json
{
scripts: {
"pre-commit": "pnpm run --filter \"@product/*\" pre-commit",
"prepare": "husky install"
}
}
3.添加赫斯基的预先承诺挂钩:
仍然在您的主目录中,创建一个赫斯基的预制挂钩,该挂钩运行您的新预订脚本:
> npx husky add .husky/pre-commit "pnpm pre-commit"
4.为单个软件包添加预密码脚本
您要添加的最后一件事是每个软件包的单个预设脚本。
我不会在此处进入实际的衬里配置,但是我建议将lint-staged与您已经使用的任何衬里一起使用。绒毛阶段只会检查分阶段文件,因此您只会获得与当前提交相关的错误来节省时间和噪音。
// Individual package's package.json
{
scripts: {
"pre-commit": "lint-staged"
}
}
如果您不在项目中添加预要脚本,那么什么都不会破坏。这对很多情况都很好,但是请注意不要因为此而错过为新项目添加钩子脚本。
5.就是这样!
下次您提交一些事情时,所有包的pre-commit
脚本都将运行。
结论
git Hooks&Husky是强大的工具,可让您执行运行本地脚本并保持编码标准的功能。通过使用这种方法,您可以在Monorepo中享受钩子的优势和适当的脚本范围(每个项目都有其自己的脚本)。
您怎么看?您会以不同的方式处理吗?
感谢Yonatan Kra的周到和彻底的评论。查看他的blog,以获取许多经验丰富的开发人员的好文章。
封面图片是用dall-e 2进行的。我对钓鱼不了解,所以我相信它对钓鱼竿的判断。