一、多人协作中Lerna配置冲突的典型场景
很多做单仓库多包架构的团队,都会用Lerna来统一管理项目,但多人一起修改配置时,经常会出现lerna.json文件合并冲突的问题。比如团队里的张同学要新增一个工具包,改了lerna.json里的包路径数组;李同学要把版本模式改成独立版本,改了version字段;等两个人提交代码,拉取合并的时候,git就会提示lerna.json有冲突,打开一看都是乱码的冲突标记,要手动一个一个改,浪费很多时间。还有的同学图省事,本地改了配置就不提交,导致别人拉下来的配置和自己的不一样,运行lerna run命令时找不到指定的包,或者依赖安装失败。这些都是因为没有统一的配置规范导致的,今天就来讲怎么避免这些问题。
二、Lerna配置文件的核心规范
2.1 统一配置文件的提交范围
很多团队会忽略,除了.lerna目录(这个是Lerna运行时生成的,不用提交),lerna.json是必须要提交到git仓库的。有同学觉得这个是本地配置,改了也没关系,其实不对,因为Lerna的大部分全局配置都存在这里,比如包的路径、版本模式、要用的包管理工具。如果每个人都不提交,那团队里新同学拉下来的仓库,lerna.json就是初始默认的,根本跑不起来。所以规范第一条:lerna.json必须提交,而且只能通过git提交,不能本地随意修改不推送。另外,.gitignore里要确保不遗漏.lerna目录,还有每个人本地的临时配置文件,比如个人的.lerna-custom.json,也要加入.gitignore,避免污染仓库。
2.2 关键配置项的约束规则
Lerna的lerna.json里有几个关键项,是团队必须约定好不能随意改的,改之前要同步全团队: 第一个是version字段,团队要约定用固定版本还是独立版本,不能有人一会用这个一会用那个; 第二个是npmClient字段,约定统一用npm、yarn还是pnpm,避免每个人的包管理工具不一样,生成的lock文件冲突,或者Lerna运行时找不到对应命令; 第三个是packages数组,所有包的存放路径,比如都放在packages/目录下,不能有人放其他地方,比如自己新建一个utils/目录,导致Lerna找不到包; 第四个是command配置,比如run命令的参数,统一加--no-audit,或者stream输出,避免有人改了导致命令输出混乱。
2.3 配置的文档化说明
虽然lerna.json本身不支持注释,但团队可以在项目的README.md里加一个lerna配置的说明文档,把每个关键项的含义和约定写法写清楚,比如: lerna.json说明:
- version:固定为项目统一版本,每次发布手动更新,禁止使用independent
- npmClient:统一使用npm,禁止修改成yarn或pnpm
- packages:所有包必须放在packages/下,新增包需在数组后加路径,不能加不属于packages的目录 这样新同学或者老同学改的时候,一看就知道规则,不会乱改。
三、规范配置的实战示例
下面给大家一个完整的、符合规范的lerna配置示例,用JSONC格式(支持注释的JSON,方便团队看说明):
{
// 团队约定:统一用固定版本模式,版本号每次发布时手动更新,禁止使用independent
"version": "2.1.0",
// 团队约定:统一用npm作为包管理工具,禁止修改成yarn或pnpm
"npmClient": "npm",
// 团队约定:所有包都放在packages目录下,新增包时必须在这里加路径,不能加其他目录
"packages": [
"packages/*",
"packages/shared",
"packages/utils"
],
// 团队约定:给run命令加固定参数,避免审计检查
"command": {
"run": {
"stream": true,
"npmClientArgs": ["--no-audit"]
}
}
}
再给大家看一个有冲突的错误示例,这个是两个人改了不同的配置,合并后出现的冲突:
{
// A同学改的:把version改成了独立模式
"version": "independent",
// B同学改的:把npmClient改成了pnpm
"npmClient": "pnpm",
// A同学加的:新增了packages/utils路径
"packages": [
"packages/*",
"packages/utils"
],
// B同学加的:新增了packages/tools路径
"packages": [
"packages/*",
"packages/tools"
]
}
这个合并后的文件是无效的,因为有两个相同的packages键,运行Lerna命令时会直接报错。解决这个冲突的方法很简单:先 revert 本地的配置,然后去git仓库看最新的lerna.json,按照最新的规范改,或者在合并前先和对方沟通,确定用谁的配置,然后再提交。
四、规范的应用场景与技术优缺点
4.1 应用场景
这个规范主要适用于多人协作的单仓库多包架构项目,比如前端团队开发的组件库(有核心组件包、工具函数包、业务组件包)、微前端架构的项目(多个子应用放在同一个仓库)、开源项目的多包发布等。只要是用Lerna管理的多包项目,只要有两个以上的开发者,都需要这个规范来避免配置冲突。
4.2 技术优缺点
优点很明显:第一,减少配置冲突,避免手动解决merge冲突的时间,之前可能每个月要花几个小时处理lerna.json的冲突,现在几乎不会出现;第二,统一了团队的配置,不管谁拉下来仓库,运行Lerna命令都不会出因为配置不一致的报错;第三,新同学上手快,一看README的配置说明就知道规则,不用问老成员;缺点也有,就是需要团队有专人维护这个规范,定期更新README里的配置说明,还要提醒新同学遵守,不过这个工作量很小,大概每次培训新成员的时候提一下就够了。
4.3 注意事项
这里要特别注意几个点:第一,绝对不能随意修改约定好的关键配置项,比如version模式和npmClient,要改必须全团队同步,讨论通过后再改;第二,提交lerna.json前,必须用本地的Lerna命令测试一下,比如lerna ls,确保配置正确,没有写错路径;第三,git merge的时候,如果出现lerna.json的冲突,不要随便改,先去看git的冲突标记,把多余的键删掉,保留团队约定的配置,或者用git show命令看对方的修改内容,确定哪个是对的;第四,本地的临时配置,比如自己的lerna-custom.json,一定要加入.gitignore,避免提交到仓库污染配置。
五、总结
多人协作的Lerna项目,配置冲突是很常见的问题,但只要提前制定好规范,统一配置的提交和约束,就能完全避免这些麻烦。核心就是:lerna.json必须提交,关键配置项要和团队约定好,文档化说明配置,实战中遇到冲突要及时沟通解决。这样团队协作起来会轻松很多,不用再花时间处理莫名其妙的配置报错,专注在项目功能的开发上。
评论
围绕“Lerna配置文件规范:避免多人协作引发的配置冲突问题”参与讨论