ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

commitlint 与 Lerna 集成指南:@commitlint/config-lerna-scopes 共享配置的演进、实现与迁移

commitlint 与 Lerna 集成指南:@commitlint/config-lerna-scopes 共享配置的演进、实现与迁移 开发工具Lint代码质量【免费下载链接】commitlint Lint commit messages项目地址https://gitcode.com/gh_mirrors/co/commitlint点击查看免费下载导读commitlint/config-lerna-scopes是 commitlint 官方提供的共享配置包用于在 Lerna monorepo 中把scope-enum规则的值自动绑定为仓库内所有 package 的名称从而保证提交信息的 scope 一定是真实存在的包名。本文以该包的 CHANGELOG 为主线结合仓库内源码、测试与 fixtures完整还原它的工作机制、历代 Lerna 版本兼容策略、Node 版本与模块体系的变更以及官方推荐的迁移路径读完即可在自己的 Lerna 仓库中直接启用并对升级影响心中有数。一、这个配置包解决什么问题在一个典型的 Lerna monorepo 中改动通常发生在某个子包内提交信息需要写清楚改动属于哪个包。手动维护一份 scope 枚举列表既不实时、也容易漏包而本包的做法是运行时动态扫描仓库把所有 package 名作为scope-enum的合法取值。从当前实现index.js看该配置包只导出一个对象export default { utils: { getProjects }, rules: { scope-enum: (ctx) getProjects(ctx).then((packages) [2, always, packages]), }, };scope-enum规则以三元组[severity, modifier, value]形式返回严重级别2error、修饰符always必须匹配、取值packages动态计算出的包名数组。测试index.test.js分别断言了这三项例如expect(severity).toBe(2)与expect(modifier).toBe(always)并验证该规则在缺少 context 时也不会抛错。包名提取逻辑index.js还有一个细节scoped 包名scope/pkg会被去掉 scope 前缀只保留短名。也就是说名为myorg/ui-kit的包合法 scope 是ui-kitname.charAt(0) ? name.split(/)[1] : name二、在 Lerna 仓库中启用2.1 安装该包在package.json中声明了peerDependencies为lerna且标记为optional见 package.json这意味着即使仓库里没有安装 Lerna 也不会阻塞安装只是动态扫描需要lerna.json与实际的包目录存在。以 npm 为例npm install --save-dev commitlint/cli commitlint/config-lerna-scopes2.2 配置在commitlint.config.js中直接extends该配置export default { extends: [commitlint/config-lerna-scopes], };commitlint 会加载该包导出的规则用仓库内真实的包名动态校验提交信息的scope。合法提交示例feat(ui-kit): add new button variant fix(api): correct timeout handling2.3 底层扫描流程getProjectsindex.js的执行路径如下读取context.cwd默认process.cwd()尝试调用commitlint/config-workspace-scopes的getPackages检测 npm/yarn workspaces若检测到原生 workspaces则直接使用 workspace 包名并打印弃用警告详见下文迁移章节否则读取lerna.json的packages声明将每个 glob 模式归一化为指向package.json的 globnormalizePatternsindex.js用 Node 的fs.promises.glob递归匹配同时排除node_modules与bower_components读取并解析所有package.json最终提取包名并排序。仓库内 fixtures 覆盖了多种形态basicpackages/*、nested嵌套两级目录、modules混合普通包与命名空间目录、scopedpackages/**、empty与no-packages-declaration无packages声明。对应的测试断言了每种形态的预期结果例如嵌套仓库返回[nested-a, nested-b, nested-c]index.test.jsscoped 仓库返回[scoped-a, scoped-b]index.test.js。当lerna.json中没有packages声明时返回空数组index.js对应测试为work with no declared packages。三、从 CHANGELOG 看版本演进与兼容策略CHANGELOG 完整记录了该包从 v3.0.02017-07-10到 v21.2.02026-06-30的变更以下是关键节点3.1 Lerna 版本支持路线版本节点变更内容说明v3.0.x2017-07支持非标准 Lerna 仓库support non-standard lerna repos最早的动态包名扫描能力v4.1.12017-10修复新版 Lerna 的包列表获取fix package list get with recent lerna versions紧跟 Lerna API 变化v9.0.02020-05修正lerna在peerDependencies中的声明依赖关系规范化v11.0.02020-09移除对 Lerna v2 的支持BREAKING CHANGES进入 Lerna v3 时代v12.1.02021-03继续支持 Lerna v3兼容策略保持v15.0.02021-11升级到 Lerna v4BREAKING CHANGES测试改用 npm bootstrap 简化v19.7.02025-01支持 Lerna 7 和 8兼容最新 Lerna 主版本3.2 工作区workspaces支持与转向v12.0.02021-01新增了对 yarn workspaces 的支持。从当前源码看这一能力仍然保留但已被标记为过渡性getProjects会先探测 npm/yarn 原生 workspaces命中时直接返回 workspace 包名并输出三行警告It seems that you are using npm/yarn workspaces instead of lernas packages declaration. Support for workspaces will be removed in a future major version of this package. Please make sure to transition to commitlint/config-workspace-scopes in the near future.测试index.test.js用fixtures/transition-to-workspace-scopes该 fixture 的 package.json 声明了workspaces: [./packages/*]验证了警告输出与返回值[workspace-package]。3.3 模块体系与运行时要求v13.0.02021-05最低 Node 版本提升到 12v17.0.02022-05最低 Node 版本提升到 14移除 Node 12 支持v18.0.02023-10最低 Node 版本提升到 18移除 Node 14/16 支持v19.0.02024-02迁移到纯 ESMBREAKING CHANGES测试框架从 Jest 迁移到 vitest当前 package.json 中type: module即为该变更的落地v21.0.02026-05最低 Node 版本提升到v22移除 Node 18/20 支持当前 package.json 中engines: { node: 22.12.0 }即为该变更的落地。3.4 依赖与健壮性修复v19.8.02025-03移除已废弃的lerna/project依赖#4284并用node:前缀引用内置模块以绕过require.cache调用#4302当前源码第 1-3 行的node:path、node:fs/promises导入即是这一演进的体现v12.1.12021-04忽略没有name字段的包ignore packages without names这与源码中if (name)的判断完全对应index.jsv17.6.22023-05修复 Lernapackage.json的解析lerna package.json resolutionv17.6.32023-05补充缺失依赖多个版本v9.0.0、v16.2.4、v18.6.1 等持续更新semver依赖。四、关键源码实现细节4.1 glob 模式归一化lerna.json中的packages通常写作packages/*、packages/**或带package.json结尾的形式。normalizePatterns用正则pattern.replace(/\/?$/, /package.json)保证每个模式最终都指向package.jsonindex.js例如packages/*→packages/*/package.jsonpackages/**→packages/**/package.json4.2 去重与排序由于不同 glob 模式可能重叠命中同一package.json源码用Array.from(new Set(...))去重最终结果经.sort()排序输出[index.js](https://link.gitcode.com/i/c70cbd00d89685676af34d7577353faf#L53-L59, L92)保证规则取值稳定、可预期也方便 diff 审查。4.3 context 注入scope-enum规则接收 commitlint 传入的 lint contextgetProjects从中读取cwdindex.js。这意味着该配置同样适用于 CI 或非标准目录结构只要把 context 的cwd指向仓库根目录就能在任意位置触发正确的包名扫描。测试通过fn({ cwd })传入各 fixture 目录验证了这一点。五、迁移到 commitlint/config-workspace-scopes对于使用 npm/yarn 原生 workspaces 而非 Lernapackages声明的仓库官方明确建议转向独立的commitlint/config-workspace-scopes。两个包的机制几乎一致都通过utils.getPackages扫描package.json并返回[2, always, packages]形式的规则区别在于前者读取lerna.json的packages后者读取根package.json的workspaces字段index.js且后者会用node:前缀与globSync实现同步扫描并自动过滤无name的包index.js。迁移只需两步npm install --save-dev commitlint/config-workspace-scopesexport default { extends: [commitlint/config-workspace-scopes], };迁移前请确认根package.json的workspaces字段确实存在且格式正确必须是非空数组否则getPackages会直接返回空数组index.js导致scope-enum无任何合法取值。六、升级前需要知道的事结合 CHANGELOG 中的 BREAKING CHANGES升级到当前 v21.x 系列时重点检查Node 版本当前版本要求node 22.12.0Node 18/20 已不再支持v21.0.0 起模块体系包已是纯 ESMtype: modulerequire()引入将不再可用配置文件需使用 ESM 语法Lerna 版本本包面向 Lerna v4 及更新版本v19.7.0 起支持 v7/v8若仍停留在 Lerna v2 需先升级 Lernaworkspaces 用户若仓库实际使用 npm/yarn workspaces运行时会出现过渡警告且未来主版本将移除该能力建议尽快迁移到commitlint/config-workspace-scopesscope 命名规则scoped 包只取短名myorg/pkg→pkg提交时 scope 不要带myorg/前缀。七、相关资源配置包入口与实现commitlint/config-lerna-scopes/index.js测试与 fixturescommitlint/config-lerna-scopes/index.test.js、commitlint/config-lerna-scopes/fixtures演进记录commitlint/config-lerna-scopes/CHANGELOG.md推荐迁移目标commitlint/config-workspace-scopes/index.js及对应 fixtures包元数据依赖、engines、peerDependenciescommitlint/config-lerna-scopes/package.json赞分享开发工具Lint代码质量【免费下载链接】commitlint Lint commit messages项目地址https://gitcode.com/gh_mirrors/co/commitlint点击查看免费下载相关推荐commitlint 配置 commitlint/config-lerna-scopes为 Lerna 单体仓库强制校验包作用域commitlint 配置 commitlint/config lerna scopes为 Lerna 单体仓库强制校验包作用域 本篇技术指南围绕 comm开发工具Lint代码质量使用 commitlint/config-lerna-scopes 校验 Lerna 项目提交的包作用域使用 commitlint/config lerna scopes 校验 Lerna 项目提交的包作用域 本指南以 commitlint/config le开发工具Lint代码质量commitlint/config-pnpm-scopes为 pnpm workspace 仓库自动生成 scope 枚举的 commitlint 共享配置commitlint/config pnpm scopes为 pnpm workspace 仓库自动生成 scope 枚举的 commitlint 共享配置开发工具Lint代码质量创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表